| #!/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  | 
|           |