#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#  
 | 
#  
 | 
##@package AILoginIn  
 | 
# @todo: Íæ¼ÒÊÕ°ü´¦Àí  
 | 
#  
 | 
# @author:whx  
 | 
# @date 2012-08-30 16:30  
 | 
# @version 1.0  
 | 
  
 | 
# ¼òҪ˵Ã÷ Íæ¼ÒÊÕ°ü´¦Àí  
 | 
# ÏêϸÃèÊö None  
 | 
  
 | 
import base64  
 | 
from AI.AIBase import *  
 | 
from Protocol.PacketsSend import tagCCliectReborn  
 | 
from Protocol.PacketsSend import tagCGMCMD  
 | 
import logging  
 | 
import datetime  
 | 
import time  
 | 
  
 | 
from Robot.PlayerData import PlayerData  
 | 
  
 | 
VER = "2012-08-30 16:30"  
 | 
  
 | 
#×î´óµÄ×ø±ê  
 | 
MaxPos = 300  
 | 
  
 | 
#×î´óÖØÁ¬´ÎÊý  
 | 
Def_Max_ReConnectCnt = 100  
 | 
  
 | 
#Ö÷½ÇËÀÍöºó20Ãë·¢°ü¸´»î  
 | 
ReBornTime = 20 * 1000  
 | 
#¶ÏÏß10ÃëºóÖØµÇ  
 | 
ReConnectTime = 10 * 1000  
 | 
  
 | 
#npcʼþÀàÐÍ  
 | 
(  
 | 
NpcAttackType,   
 | 
NpcEventType  
 | 
) = range(2)  
 | 
  
 | 
  
 | 
#OBJÀàÐÍ  
 | 
[  
 | 
NoneType,  
 | 
PlayerType,  
 | 
NpcType,  
 | 
ItemType] = range(4)  
 | 
  
 | 
  
 | 
## µÇ½µÄʱºò¿ªÆô  
 | 
#  
 | 
# ¼Ì³ÐAIBase  
 | 
class AILoginIn(AIBase):  
 | 
      
 | 
    ## ËùÓÐAI±ØÐë²ÉÓÃÕâÖй̶¨µÄ³õʼ»¯ÔÐÍ£¬ÒÔ±ãAIMgr×Ô¶¯¼ÓÔØ  
 | 
    #  @param None : None  
 | 
    #  @return bool  
 | 
    #  @remarks ´ËAI²»ÐèÒªÖÜÆÚÐÔ±»µ÷Óã¬ËùÒÔÉèÖÃΪ²»ÆôÓÃTimer  
 | 
    def __init__(self, robot):  
 | 
        AIBase.__init__(self, robot, 3, True, True)  
 | 
        self.roundNpcDict = {}  
 | 
        self.roundPlayerDict = {}  
 | 
        self.playerDieTime = 0  
 | 
        self.playerDisconnectTime = 0  
 | 
  
 | 
      
 | 
    ## Ñ»·µ÷ÓÃ  
 | 
    #  @param None : None  
 | 
    #  @return None  
 | 
    #  @remarks  
 | 
    def _Process(self):  
 | 
        return  
 | 
        #self.IsKillSelf()  
 | 
#===============================================================================  
 | 
#        playerId = self.robot.GetPlayerInfo().GetPlayerID()  
 | 
#        curPosX, curPosY = self.robot.GetPlayerInfo().GetPos()  
 | 
#   
 | 
#              
 | 
#        curTime = self.GetTick()  
 | 
#          
 | 
#        if self.playerDieTime > 0 and curTime - self.playerDieTime > ReBornTime:  
 | 
#            if self.robot.GetIsLoginOK():  
 | 
#                #·¢°ü¸´»î  
 | 
#                self.PlayerReborn()  
 | 
#                  
 | 
#            self.playerDieTime = 0  
 | 
#===============================================================================  
 | 
  
 | 
          
 | 
  
 | 
    ## ¶ÏÏßÖØÐµÇ½  
 | 
    #  @param curTime : µ±Ç°Ê±¼ä  
 | 
    #  @return None  
 | 
    #  @remarks  
 | 
    def ReConnect(self, curTime):  
 | 
        if self.robot.IsConnected():  
 | 
            curPosX, curPosY = self.robot.GetPlayerInfo().GetPos()  
 | 
              
 | 
            if self.__IsCorrectPos(curPosX, curPosY):  
 | 
                return  
 | 
              
 | 
            self.SendGMRoleDead()  
 | 
#            self.robot.DestroyRobot()  
 | 
#            self.playerDisconnectTime = curTime  
 | 
              
 | 
            logging.info('×ø±ê´íÎ󣬶Ͽª')  
 | 
              
 | 
        else:  
 | 
            if self.robot.GetIsLoginOK():  
 | 
                self.robot.DestroyRobot()  
 | 
                  
 | 
            if  self.playerDisconnectTime == 0:  
 | 
                self.playerDisconnectTime = curTime  
 | 
              
 | 
            if self.playerDisconnectTime > 0 and curTime - self.playerDisconnectTime > ReConnectTime:  
 | 
                  
 | 
                self.robot.ReCreateRobot()  
 | 
                  
 | 
                if self.robot.IsConnected():   
 | 
                    self.playerDisconnectTime = 0  
 | 
                    logging.info('ÖØÐÂÁ¬½ÓÁË')  
 | 
                  
 | 
        return  
 | 
          
 | 
  
 | 
      
 | 
    ## ÏòAIMgr×¢²áÏûÏ¢»Øµ÷º¯Êý  
 | 
    #  @param None : None  
 | 
    #  @return bool  
 | 
    #  @remarks   
 | 
    def _RegisterPacket(self, aiMgr):  
 | 
        return  
 | 
        #¶ÔÏó¿ªÊ¼Òƶ¯  
 | 
        #aiMgr.RegNetMsg(0x0501, self.OnObjMove, True)  
 | 
        #¶ÔÏóÍ£Ö¹ÒÆ¶¯  
 | 
        #aiMgr.RegNetMsg(0x0502, self.OnObjStopMove, True)  
 | 
        #npcËÀÍö  
 | 
        #aiMgr.RegNetMsg(0x0608, self.OnNPCDie, True)  
 | 
        #npc³öÏÖ  
 | 
        #aiMgr.RegNetMsg(0x0406, self.OnNPCAppear, True)  
 | 
        #npcÏûʧ  
 | 
#        aiMgr.RegNetMsg(0x0407, self.OnNPCDisappear, True)  
 | 
        #Íæ¼ÒËÀÍö  
 | 
        #aiMgr.RegNetMsg(0x0609, self.OnPlayerDie, True)  
 | 
        #Íæ¼ÒÖØÉú  
 | 
        #aiMgr.RegNetMsg(0x0419, self.OnPlayerReborn, True)  
 | 
          
 | 
        #ÆäËûÍæ¼Ò³öÏÖ  
 | 
        #aiMgr.RegNetMsg(0x0434, self.OnAreaPlayerAppear, True)  
 | 
        return  
 | 
          
 | 
    ## ¼Ç¼ÖÜÎ§Íæ¼Ò  
 | 
    #  @param objId : Íæ¼ÒID  
 | 
    #  @param objPosX : x  
 | 
    #  @param objPosY : y  
 | 
    #  @return None   
 | 
    def SetRoundPlayerDict(self, objId, objPosX, objPosY):  
 | 
        self.roundPlayerDict[objId] = [objPosX, objPosY]  
 | 
          
 | 
        #ÉèÖýøÈëÍæ¼ÒÊý¾Ý  
 | 
        self.robot.GetPlayerInfo().SetRoundPlayerDict(self.roundPlayerDict)  
 | 
          
 | 
      
 | 
    ## ÊÕµ½Íæ¼Ò³öÏÖ  
 | 
    #  @param packData : °ü½á¹¹  
 | 
    #  @return None    
 | 
    def OnAreaPlayerAppear(self, packData):  
 | 
        playerId = packData.PlayerID  
 | 
        playerPosX = packData.PosX  
 | 
        playerPosY = packData.PosY  
 | 
        faction = packData.Faction #ÕóÓª  
 | 
        isActive = packData.IsAlive  
 | 
          
 | 
        if not isActive:  
 | 
            return  
 | 
          
 | 
        self.SetRoundPlayerDict(playerId, playerPosX, playerPosY)  
 | 
          
 | 
          
 | 
          
 | 
    ## Ë¢ÐÂÖÜΧnpcµÄλÖà  
 | 
    #  @param objId : npcµÄobjId  
 | 
    #  @param objPosX:X×ø±ê  
 | 
    #  @param objPosY:Y×ø±ê  
 | 
    #  @return None  
 | 
    #  @remarks None  
 | 
    def RefreshRoundNpc(self, objId, objPosX, objPosY):  
 | 
        self.roundNpcDict[objId] = [objPosX, objPosY]  
 | 
        #ÉèÖýøÈëÍæ¼ÒÊý¾Ý  
 | 
        self.robot.GetPlayerInfo().SetRoundNpcDict(self.roundNpcDict)  
 | 
        #logging.info('Ë¢ÐÂÖÜΧnpcµÄλÖÃmapId=%s,objId=%s,self.roundNpcDict=%s'%(mapId, objId, self.roundNpcDict))  
 | 
      
 | 
      
 | 
    ## É¾³ýÖÜΧnpc  
 | 
    #  @param objId : npcµÄobjId  
 | 
    #  @return None  
 | 
    #  @remarks None  
 | 
    def DelRoundNpc(self, objId):  
 | 
        if not self.roundNpcDict.has_key(objId):  
 | 
            return  
 | 
          
 | 
        self.roundNpcDict.pop(objId)  
 | 
        #ÉèÖýøÈëÍæ¼ÒÊý¾Ý  
 | 
        self.robot.GetPlayerInfo().SetRoundNpcDict(self.roundNpcDict)  
 | 
          
 | 
          
 | 
    ## É¾³ýÖÜÎ§Íæ¼Ò  
 | 
    #  @param objId : npcµÄobjId  
 | 
    #  @return None  
 | 
    #  @remarks None  
 | 
    def DelRoundPlayer(self, objId):  
 | 
        if not self.roundPlayerDict.has_key(objId):  
 | 
            return  
 | 
          
 | 
        self.roundPlayerDict.pop(objId)  
 | 
          
 | 
        #ÉèÖýøÈëÍæ¼ÒÊý¾Ý  
 | 
        self.robot.GetPlayerInfo().SetRoundPlayerDict(self.roundPlayerDict)  
 | 
          
 | 
      
 | 
    ## ¶ÔÏóÒÆ¶¯  
 | 
    #  @param packData : ·â°ü¶ÔÏó  
 | 
    #  @return None  
 | 
    #  @remarks None  
 | 
    def OnObjMove(self, packData):  
 | 
        objId = packData.ObjID  
 | 
        objType = packData.ObjType  
 | 
        objPosX = packData.DestPosX  
 | 
        objPosY = packData.DestPosY  
 | 
          
 | 
        if objType == PlayerType:  
 | 
            self.SetRoundPlayerDict(objId, objPosX, objPosY)  
 | 
            return  
 | 
          
 | 
        elif objType == NpcType:  
 | 
            self.RefreshRoundNpc(objId, objPosX, objPosY)            
 | 
            return  
 | 
          
 | 
        return  
 | 
      
 | 
      
 | 
    ## ¶ÔÏóÍ£Ö¹ÒÆ¶¯  
 | 
    #  @param packData : ·â°ü¶ÔÏó  
 | 
    #  @return None  
 | 
    #  @remarks None  
 | 
    def OnObjStopMove(self, packData):  
 | 
        objId = packData.ObjID  
 | 
        objType = packData.ObjType  
 | 
        objPosX = packData.PosX  
 | 
        objPosY = packData.PosY  
 | 
          
 | 
        if objType == PlayerType:  
 | 
            self.SetRoundPlayerDict(objId, objPosX, objPosY)  
 | 
            return  
 | 
          
 | 
        elif objType == NpcType:  
 | 
            self.RefreshRoundNpc(objId, objPosX, objPosY)  
 | 
            return  
 | 
      
 | 
      
 | 
    ## npc³öÏÖ  
 | 
    #  @param packData : ·â°ü¶ÔÏó  
 | 
    #  @return None  
 | 
    #  @remarks None  
 | 
    def OnNPCAppear(self, packData):  
 | 
        objId = packData.ObjID  
 | 
        objEventType = packData.NPCEventType  
 | 
        objIsActive = packData.IsActive  
 | 
        objPosX = packData.PosX  
 | 
        objPosY = packData.PosY  
 | 
          
 | 
        #²»Êǿɹ¥»÷µÄnpc£¬²»ÊÇ»î×ŵÄnpc  
 | 
        if (objEventType != NpcAttackType) or (not objIsActive):  
 | 
            return  
 | 
          
 | 
        self.RefreshRoundNpc(objId, objPosX, objPosY)  
 | 
        return  
 | 
      
 | 
      
 | 
    ## npcËÀÍö  
 | 
    #  @param packData : ·â°ü¶ÔÏó  
 | 
    #  @return None  
 | 
    #  @remarks None  
 | 
    def OnNPCDie(self, packData):  
 | 
        objId = packData.ObjID  
 | 
          
 | 
        self.DelRoundNpc(objId)  
 | 
          
 | 
          
 | 
    ## Íæ¼ÒËÀÍö  
 | 
    #  @param packData : ·â°ü¶ÔÏó  
 | 
    #  @return None  
 | 
    #  @remarks None  
 | 
    def OnPlayerDie(self, packData):  
 | 
        return  
 | 
        #=======================================================================  
 | 
        # deadPlayerId = packData.PlayerID  
 | 
        #   
 | 
        # if deadPlayerId == self.robot.GetPlayerInfo().GetPlayerID():  
 | 
        #    self.playerDieTime = self.GetTick()  
 | 
        #    # É¾³ý´íÎóÁбíÍæ¼Ò  
 | 
        #    self.DelIsErrIdList(deadPlayerId)  
 | 
        #   
 | 
        # else:  
 | 
        #    self.DelRoundPlayer(deadPlayerId)  
 | 
        #=======================================================================  
 | 
          
 | 
          
 | 
    ## Íæ¼ÒÖØÉú  
 | 
    #  @param packData : ·â°ü¶ÔÏó  
 | 
    #  @return None  
 | 
    #  @remarks None  
 | 
    def OnPlayerReborn(self, packData):  
 | 
        return  
 | 
        #=======================================================================  
 | 
        # if packData.PlayerID != self.robot.GetPlayerInfo().GetPlayerID():  
 | 
        #    return  
 | 
        # # É¾³ý´íÎóÁбíÍæ¼Ò  
 | 
        # self.robot.GetPlayerInfo().SetPosX(packData.PosX)  
 | 
        # self.robot.GetPlayerInfo().SetPosY(packData.PosY)  
 | 
        # self.DelIsErrIdList(packData.PlayerID)  
 | 
        #=======================================================================  
 | 
          
 | 
      
 | 
    ## ·¢°üµ½¸´»îµã¸´»î  
 | 
    #  @param None : None  
 | 
    #  @return None  
 | 
    #  @remarks None  
 | 
    def PlayerReborn(self):  
 | 
        ReBorn = tagCCliectReborn()  
 | 
        ReBorn.Clear()  
 | 
        ReBorn.Type = 0  
 | 
        ReBorn.MoneyType = 0  
 | 
        self.robot.Send(ReBorn)  
 | 
          
 | 
      
 | 
    ## »ñȡʱ¼äTick  
 | 
    #  @param None : None  
 | 
    #  @return bool  
 | 
    #  @remarks  
 | 
    def GetTick(self):  
 | 
        timeTuple = datetime.datetime.today().timetuple()  
 | 
        tick = time.mktime(timeTuple) * 1000  
 | 
        return tick  
 | 
          
 |