#!/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  
 | 
      
 | 
    def SetNeedDestroy(self, result):  
 | 
        self.__destroy = result  
 | 
      
 | 
    ## 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 __peer:0x%08X",  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 ):  
 | 
        pass  
 | 
        #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 ) )  
 | 
        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() )  
 | 
          
 | 
         
 |