| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #  | 
| #  | 
| ##@package RobotBase  | 
| # @todo: ÓÃÓÚ±£´æµ¥¸ö»úÆ÷ÈËʵÌåµÄÏà¹ØÊý¾ÝºÍÖ÷ÒªµÄ²Ù×÷½Ó¿Ú  | 
| #  | 
| # @author:Alee  | 
| # @date 2010-01-13 15:30  | 
| # @version 1.0  | 
|   | 
| # ¼òҪ˵Ã÷: ÓÃÓÚ±£´æµ¥¸ö»úÆ÷ÈËʵÌåµÄÏà¹ØÊý¾ÝºÍÖ÷ÒªµÄ²Ù×÷½Ó¿Ú  | 
| # ÏêϸÃèÊö :None  | 
|   | 
| import logging  | 
| from ConfigurationReader.RobotConfigParam import RobotConfigParams  | 
| from ConfigurationReader.ConfigIniReader import GetConfig  | 
| from AI import AIManager  | 
| import PlayerData  | 
| from binary.PyNetwork import *  | 
|   | 
| from Protocol.PacketsSend import tagCClientPackVersion  | 
| from Protocol.PacketsSend import tagCFakePack, tagCGameServerGeneralPack  | 
|   | 
| VER = "2010-01-13 15:30"  | 
|   | 
| DUMP_NETWORK_USAGE = False  | 
|   | 
|   | 
| ## RobotBase  | 
| #  | 
| # RobotBase  | 
| class RobotBase(object):  | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def __init__(self, asioMgr, tokenInfo ):  | 
|         self.__mgr = asioMgr  | 
|         self.__peer = 0  | 
|         self.__reason = 0  | 
|         self.__params = tokenInfo  | 
|         self.__aimgr = AIManager.AIManager(self)  | 
|         self.__playerinfo = PlayerData.PlayerData()  | 
|         self.__isloginok = False  | 
|         self.__connectCnt = 0  | 
|         self.__destroy = False  # Òò¸÷ÖÖÒâÍâ·¢Éú¶Ï¿ª£¬Íâ²ã¹ÜÀíͨ¹ý´ËÅжÏÔÚ¶ÓÁÐÖÐÈ¥³ý  | 
|         if DUMP_NETWORK_USAGE:  | 
|             self.allrecv = 0  | 
|             self.allsend = 0  | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def __del__(self):  | 
|         self.DestroyRobot()  | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def __str__(self):  | 
|         return "Robot_%s" % self.GetRobotConfig()[1]  | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def SetIsLoginOK(self,isloginok):  | 
|         self.__isloginok = isloginok  | 
|         if not isloginok:  | 
|             self.SetAIActive( ["AIOnlineReply"], False )  | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None        | 
|     def SetLastDisconnectReason(self, reason ):  | 
|         self.__reason = reason;  | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def GetLastDisconnectReason(self):  | 
|         return self.__reason;  | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def ClearDisconnectReason(self):  | 
|         self.SetLastDisconnectReason( 0 )  | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def SetAIActive(self, aiList, bActive ):  | 
|         self.__aimgr.SetAIActive( aiList, bActive )  | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def StatusString(self):  | 
|         statusStr = ""  | 
|         if self.GetIsLoginOK():  | 
|             statusStr += "LoginOK "  | 
|         else:  | 
|             statusStr += "NOT Login "  | 
|               | 
|         if self.IsConnected():  | 
|             statusStr += "Connected "  | 
|         else:  | 
|             statusStr += "NOT Connected "  | 
|               | 
|         if 0 != self.GetLastDisconnectReason():  | 
|             statusStr += "DisconnectReason:%d " % self.GetLastDisconnectReason()  | 
|               | 
|               | 
|         return statusStr  | 
|               | 
|     # ¿ÉÒԴݻٵĶÔÏó  | 
|     def GetNeedDestroy(self):  | 
|         return self.__destroy  | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None   | 
|     def GetIsLoginOK(self):  | 
|         return self.__isloginok  | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def GetRobotConfig(self):  | 
|         #(token accid mac)  | 
|         return self.__params  | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def SetPlayerInfo(self,playerinfo):  | 
|         self.__playerinfo = playerinfo  | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def GetPlayerInfo(self):  | 
|         return self.__playerinfo      | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def GetAIMgr(self):  | 
|         return self.__aimgr  | 
|               | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None     | 
|     def DestroyRobot(self):  | 
|         self.SetIsLoginOK( False )  | 
|         if 0 != self.__peer:  | 
|             self.__playerinfo = PlayerData.PlayerData()  | 
|             self.__mgr.DestroyPeer( self.__peer )  | 
|             self.__peer = 0  | 
|             return True  | 
|         else:  | 
|             return False  | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def IsConnected(self):  | 
|         if 0 == self.__peer:  | 
|             return False  | 
|         else:  | 
|             return self.__mgr.IsConnected( self.__peer )  | 
|           | 
|     ## ÖØÁ¬´ÎÊý  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def GetReconnectCount(self):  | 
|         return max( self.__connectCnt - 1, 0 )  | 
|           | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def GetPeerValue(self):  | 
|         #return 0  | 
|         return self.__mgr.GetValueOfPeer( self.__peer )  | 
|       | 
|       | 
|     ## RobotBase  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def ReCreateRobot(self):  | 
|         if self.IsConnected():  | 
|             logging.warning( "Robot is Connected, Click Disconnect first to reconnect." )  | 
|             return False  | 
|           | 
|           | 
|         if self.DestroyRobot():  | 
|             logging.warning( "0!=self.__peer, destroy it first on recreating robot..." )  | 
|               | 
|         #´´½¨Á¬½Ó  | 
|         ip = GetConfig().GetServerIP()  | 
|         port = GetConfig().GetServerPort()  | 
|         logging.debug( "Connect to %s:%d", ip, port )  | 
|         self.__peer = self.__mgr.CreatePeer()  | 
|         logging.info( "create %s __peer:0x%08X",  self.__params[1], self.GetPeerValue() )  | 
|           | 
|         #×¢²á»Øµ÷  | 
|         logging.debug( "register callback function for 0x%08X" % self.GetPeerValue() )  | 
|         self.__mgr.RegisterCallback(self.__peer, Callback_Event_OnGetPacket, self.InternalOnPacket )  | 
|         self.__mgr.RegisterCallback(self.__peer, Callback_Event_OnPacketError, self._OnPacketError )  | 
|         self.__mgr.RegisterCallback(self.__peer, Callback_Event_OnPacketCRCError, self._OnPacketCRCError )  | 
|         self.__mgr.RegisterCallback(self.__peer, Callback_Event_OnOutputMsg, self._OnOutputMsg )  | 
|         self.__mgr.RegisterCallback(self.__peer, Callback_Event_OnSocketError, self._OnSocketError )  | 
|         self.__mgr.RegisterCallback(self.__peer, Callback_Event_OnConnected, self._OnConnected )  | 
|           | 
|         #Æô¶¯AILoginout  | 
|         self.SetAIActive( [ "AILoginout" ], True )  | 
|         self.SetAIActive( [ "AIPlayerActPlayer" ], True )  | 
|           | 
|         self.__mgr.ConnectPeer( self.__peer, ip, port )  | 
|           | 
|         self.__connectCnt += 1  | 
|           | 
|         #µ÷ÓÃÖØÔØÊµÏÖ  | 
|         self._RecreateRobot()  | 
|           | 
|         return True  | 
|           | 
|     ## ¹©×ÓÀàÖØÔØµÄÖØÐ´´½¨»úÆ÷ÈËʵÏÖ  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def _RecreateRobot(self):  | 
|         pass  | 
|           | 
|   | 
|     ## ¿É¹©ÖØÔصÄÁ¬½Ó³É¹¦»Øµ÷º¯Êý  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None     | 
|     def _OnConnected(self):  | 
|         #logging.info( "robot connect successfully. peer 0x%08X" % self.GetPeerValue()  )  | 
|           | 
|         clientPackVer = tagCClientPackVersion()  | 
|         clientPackVer.Version = GetConfig().GetVersionNo()  | 
|         logging.debug("tagCClientPackVersion %d"%(clientPackVer.Version))   | 
|         self.Send(clientPackVer)  | 
|           | 
|         self.SetAIActive( ["AIOnlineReply"], True )  | 
|         #Æô¶¯AILoginIn  | 
|         #self.SetAIActive( [ "AILoginIn" ], True )  | 
|       | 
|       | 
|     ## ½âÎöµ½ÍêÕû°üºó»á»Øµ÷´Ëº¯Êý  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None   | 
|     def InternalOnPacket(self, data, dataLen ):  | 
|         if DUMP_NETWORK_USAGE:  | 
|             self.allrecv += dataLen  | 
|             #===================================================================  | 
|             # logging.debug( "%s receive %d bytes data. recvAll:%d sendAll:%d bytes ALL:%d" \  | 
|             #              % ( str(self), dataLen, self.allrecv, self.allsend, self.allrecv+self.allsend ) )  | 
|             #===================================================================  | 
|         self.__aimgr.OnPacketData(data, dataLen)  | 
|         #µ÷ÓÃ×ÓÀàµÄÖØÔØ  | 
|         self._OnPacket(data, dataLen)  | 
|       | 
|       | 
|     ## ¹©×ÓÀàÖØÔØµÄ´¦Àí·â°üµÄʵÏÖ  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None   | 
|     def _OnPacket(self, data, dataLen ):  | 
|         pass  | 
|       | 
|       | 
|     ## ¿ò¼ÜÖÜÆÚÐԻص÷´Ëº¯Êý  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def InternalOnProcess( self ):  | 
|         #µ÷ÓÃ×ÓÀàµÄÖØÔØ  | 
|         self._OnProcess()  | 
|       | 
|       | 
|     ## ¹©×ÓÀàÖØÔØµÄ´¦Àí·â°üµÄʵÏÖ  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def _OnProcess( self ):  | 
|         pass  | 
|       | 
|   | 
|     ## Í¨ÖªÍⲿÐÅÏ¢  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def _OnOutputMsg(self, msg, msglen ):  | 
|         logging.debug( "Info outside msg:%s len:%d" % ( msg, msglen ) )  | 
|       | 
|       | 
|     ## ½â°ü´íÎó,¹©×ÓÀàÖØÔØµÄ´¦Àí·â°üµÄʵÏÖ  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def _OnPacketError(self, data, len ):  | 
|         logging.error( "ERROR in unpack data [%s] len:%d" % (data, len) )  | 
|        | 
|   | 
|     ## CRCУÑé´íÎó,¹©×ÓÀàÖØÔØµÄ´¦Àí·â°üµÄʵÏÖ  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def _OnPacketCRCError(self, crc, packet, len ):  | 
|         logging.error( "ERROR in crc checked. crc:%u packet[%s] len:%d" % (crc, packet, len) )  | 
|           | 
|       | 
|     ## ÍøÂç´íÎó,¹©×ÓÀàÖØÔØµÄ´¦Àí·â°üµÄʵÏÖ  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def _OnSocketError(self, ErrorMsg, ErrorOp ):  | 
|         #logging.error( "ERROR in Socket. __peer:0x%08X ErrorMsg:%s ErrorOp:%d" % (self.GetPeerValue(), ErrorMsg, ErrorOp) )  | 
|         self.__destroy = True  | 
|       | 
|   | 
|     ## ·¢ËÍ,½Ó¿ÚµÄsendPackΪij¸ötagXXXÀàµÄʵÀý  | 
|     #  @param None : None  | 
|     #  @return bool  | 
|     #  @remarks None  | 
|     def Send(self, sendPack ):  | 
|         if DUMP_NETWORK_USAGE:  | 
|             self.allsend += sendPack.GetLength()  | 
|             logging.debug( "%s send %d bytes data. recvAll:%d sendAll:%d ALL:%d" % \  | 
|                           ( str(self), sendPack.GetLength(), self.allrecv, self.allsend, self.allrecv+self.allsend ) )  | 
|         if not self.__peer:  | 
|             return  | 
|         self.__mgr.SendData( self.__peer, sendPack.GetBuffer(), sendPack.GetLength() )  | 
|           | 
|       | 
|     ## py×Ô¶¨Òå°ümapserver°ü  | 
|     def SendMapServerPYPack(self, sendPack):  | 
|         pyPack = tagCFakePack()  | 
|         pyPack.Clear()  | 
|         buf = sendPack.GetBuffer()  | 
|         pyPack.MsgLen = len(buf)  | 
|         pyPack.Msg = buf  | 
|           | 
|         if DUMP_NETWORK_USAGE:  | 
|             self.allsend += pyPack.GetLength()  | 
|         self.__mgr.SendData( self.__peer, pyPack.GetBuffer(), pyPack.GetLength() )  | 
|           | 
|           | 
|     ## py×Ô¶¨Òå°ügameserver°ü  | 
|     def SendGameServerPYPack(self, sendPack):  | 
|         pyPack = tagCGameServerGeneralPack()  | 
|         pyPack.Clear()  | 
|         buf = sendPack.GetBuffer()  | 
|         pyPack.DataLen = len(buf)  | 
|         pyPack.Data = buf  | 
|           | 
|         if DUMP_NETWORK_USAGE:  | 
|             self.allsend += pyPack.GetLength()  | 
|           | 
|         self.__mgr.SendData( self.__peer, pyPack.GetBuffer(), pyPack.GetLength() )  | 
|           | 
|          |