#!/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
|
|
|
|
|
## ¶ÏÏßÖØÐµÇ½
|
# @param curTime : µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks
|
def ReConnect(self, curTime):
|
self.robot.SetIsLoginOK(False)
|
self.robot.SetLastDisconnectReason(1)
|
from Robot import RobotMgr
|
RobotMgr.GetRobotMgr().DisconnectServer(self.robot)
|
|
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
|
|