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