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