#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#---------------------------------------------------------------------
|
##@package AIType_11
|
# ïÚ³µAI:Õý³£
|
# @author PanWei
|
# @date 2010-4-21
|
# @version 2.0
|
#
|
#Ä£¿éÏêϸ˵Ã÷.
|
# @change: "2010-06-09 09:50" zhengyang ïÚ³µnpc¼ÓÈëÒ쳣״̬ѣÔÎÅжÏ
|
# @change: "2010-11-22 12:15" Alee ɾ³ýÒì³£/³ÁĬÅж¨£¬ïÚ³µµÄ×ß¶¯ÌØÊâ´¦Àí
|
# @change: "2012-05-22 11:00" jiang ÐÞ¸ÄïÚ³µAIÂß¼
|
# @change: "2012-05-31 16:30" jiang ÐÞ¸ÄïÚ³µ»áÍ£ÔÚÕϰµãµ¼Ö²»ÄÜ´ÓÐÂÕÙ»½µÄbug
|
# @change: "2012-06-01 13:00" jiang ÐÞ¸ÄïÚ³µ»áÆ¯ÒÆ
|
# @change: "2012-08-10 12:00" jiang ïÚ³µÍ˳ö¸úËæÄ£Ê½Ê±Çå³ýģʽ¸½¼Óbuff
|
# @change: "2012-08-24 14:00" jiang Çå³ýbuffʱûÓе÷ÓÃbuffÏûʧ´¥·¢Âß¼
|
# @change: "2012-09-04 16:30" jiang ÐÞ¸ÄÍæ¼ÒÈ´»»µØÍ¼»òÏÂÏßïÚ³µÎ´Çå³ý״̬buff
|
# @change: "2014-10-20 21:00" hxp Ð޸ĸúËæAI
|
# @change: "2014-11-15 17:30" Alee ïÚ³µ×Ô¶¯¸úËæ×´Ì¬¾àÀë¹ýÔ¶ÔòÖ±½ÓÖÃÉí±ß
|
#---------------------------------------------------------------------
|
"""Version = 2014-11-15 17:30"""
|
#---------------------------------------------------------------------
|
import IPY_GameWorld
|
import GameWorld
|
import ChConfig
|
import NPCCommon
|
import PlayerTruck
|
import OperControlManager
|
import GameMap
|
import SkillCommon
|
import BuffSkill
|
import GameObj
|
#---------------------------------------------------------------------
|
|
#---------------------------------------------------------------------
|
##ïÚ³µÏûʧÂß¼
|
#@param curTruck ïÚ³µÊµÀý
|
#@return ·µ»ØÖµÎÞÒâÒå
|
#@remarks ïÚ³µÏûʧÂß¼
|
def ProcessDisappear(curTruck):
|
curPlayer = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, curTruck)
|
if curPlayer:
|
#æô³µÏûʧ
|
if PlayerTruck.GetHaveAutoTruck(curPlayer):
|
#Èç¹ûÍæ¼ÒµÄ½»Í¨¹¤¾ßΪæô³µµÄ»°, À뿪æô³µ
|
PlayerTruck.PlayerTruckDown(curPlayer, curTruck)
|
|
curPlayer.SetTruckID(0)
|
curPlayer.SetTruckState(IPY_GameWorld.tusNull)
|
curPlayer.SetTruck(None)
|
|
GameWorld.Log("æô³µÏûʧ, id = %s"%curTruck.GetID() , curPlayer.GetPlayerID())
|
|
curTruck.Disappear()
|
return
|
|
|
#---------------------------------------------------------------------
|
##Õý³£ïÚ³µAIÂß¼´¦Àí
|
#@param curNPC NPCʵÀý
|
#@param tick ʱ¼ä´Á
|
#@return ·µ»ØÖµÎÞÒâÒå
|
#@remarks Õý³£ïÚ³µAIÂß¼´¦Àí
|
def ProcessAI(curNPC, tick):
|
#Çл»ïÚ³µ×´Ì¬(ÔÚGameServerÖÐÇл»)
|
#===============================================================================
|
# if curNPC.GetHP() <= 0 :
|
# GameWorld.Log("Õý³£ïÚ³µAI -> ïÚ³µÇл»×´Ì¬:Ëð»µ")
|
# return
|
#===============================================================================
|
if curNPC.GetIsDisappear():
|
ProcessDisappear(curNPC)
|
return
|
|
npcControl = NPCCommon.NPCControl(curNPC)
|
#Ë¢ÐÂ×Ô¼ºµÄbuff
|
npcControl.RefreshBuffState(tick)
|
if GameObj.GetHP(curNPC) == 0 :
|
# BUFFË¢ÐÂÖпÉÄܻᵼÖÂNPCËÀÍö
|
return
|
|
#ģʽΪֹͣ״̬
|
if curNPC.GetMode() == IPY_GameWorld.trmStop:
|
if curNPC.GetCurAction() == IPY_GameWorld.laNPCMove:
|
#ÒÆ¶¯ÖÐ,Í£Ö¹ÒÆ¶¯
|
GameWorld.Log("Ä£Ê½ÎªÍ£Ö¹ÒÆ¶¯, ïÚ³µ»¹ÔÚÒÆ¶¯ÖÐ, Í£Ö¹")
|
curNPC.SetCurAction(IPY_GameWorld.laNPCNull)
|
|
__ChangeTruckPos(curNPC, tick)
|
|
return
|
|
#»ñµÃÍæ¼Ò
|
playerID = curNPC.GetOwnerID()
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
|
if not curPlayer:
|
#ïÚ³µÄ£Ê½ÐÞ¸Ä
|
__ChangTruckMode(curNPC, tick)
|
|
#ÉèÖÃAIģʽbuff
|
PlayerTruck.AddTruckStateBuff(curNPC, tick)
|
return
|
|
if curPlayer.GetHP() <= 0 :
|
return
|
|
#»ñµÃÍæ¼ÒºÍïÚ³µ¼äµÄ¾àÀë
|
dist = GameWorld.GetDist( curNPC.GetPosX(), curNPC.GetPosY(), curPlayer.GetPosX(), curPlayer.GetPosY())
|
|
#ïÚ³µÍ£Ö¹
|
if dist > ChConfig.Def_PlayerTruckMoveDist:
|
|
if not PlayerTruck.GetHaveAutoTruck(curPlayer):
|
#ïÚ³µÓëÍæ¼ÒµÄ¾àÀ볬³ö, Í£Ö¹ÒÆ¶¯, ïÚ³µ×´Ì¬ÉèÖÃΪ²»¸úËæ
|
curNPC.SetCurAction(IPY_GameWorld.laNPCNull)
|
curNPC.SetMode(IPY_GameWorld.trmStop)
|
|
#֪ͨ¿Í»§¶ËïÚ³µAIģʽ
|
PlayerTruck.Sync_TruckMode(curPlayer)
|
|
#ÉèÖÃAIģʽbuff
|
PlayerTruck.AddTruckStateBuff(curNPC, tick)
|
|
#ïÚ³µ¸úËæ¶ªÊ§, Í˳ö×Ô¶¯ÔËïÚ
|
PlayerTruck.SetAutoTruckState(curPlayer, 0)
|
|
__ChangeTruckPos(curNPC, tick)
|
else:
|
#ÔÚÀïÚÇé¿öÏÂË²ÒÆµ½Éí±ß
|
moveDestX, moveDestY = npcControl.GetMoveNearPos(curPlayer.GetPosX(),
|
curPlayer.GetPosY(),
|
ChConfig.Def_PlayerTurckBeginMoveDist)
|
|
#ÖØÖÃ×ø±ê
|
curNPC.ResetPos(moveDestX, moveDestY)
|
|
return
|
|
if dist <= ChConfig.Def_PlayerTurckBeginMoveDist:
|
# #ÒѾÔÚÖ÷È˱ßÉÏ, Í£Ö¹ÒÆ¶¯
|
# curNPC.SetCurAction(IPY_GameWorld.laNPCNull)
|
return
|
|
#²»¿ÉÒÆ¶¯ÐÐΪ״̬, ·þÎñ¶ËÏÞÖÆ
|
if not OperControlManager.IsObjCanDoAction(curNPC,
|
ChConfig.Def_Obj_ActState_ServerAct,
|
IPY_GameWorld.oalMove):
|
return
|
|
#===========================================================================
|
# #ïÚ³µÒƶ¯ÖÐ
|
# if curNPC.GetCurAction() == IPY_GameWorld.laNPCMove:
|
# #NPC×ß·ÖÐ, ²»´¦Àí
|
# return
|
#===========================================================================
|
|
#ÉèÖÃΪ×ß·״̬
|
curNPC.SetCurAction(IPY_GameWorld.laNPCMove)
|
moveDestX, moveDestY = __GetTruckMovePos(curPlayer)
|
#GameWorld.Log("ïÚ³µÒƶ¯ speed = %d"%curNPC.GetSpeed())
|
#ÕÒµ½¶ÔÏóÖÜΧ¹¥»÷·¶Î§¸ñµÄ·¶Î§×ß¹ýÈ¥
|
#curNPC.SetSpeed(curNPC.GetOrgSpeed())
|
curNPC.SetCurMoveType(IPY_GameWorld.mtNormal)
|
|
#Çå³ýÓÐÏÞÎÞµÐbuff
|
__ClearLimitSuperBuff(curNPC, tick)
|
curNPC.Move(moveDestX, moveDestY)
|
return
|
|
#---------------------------------------------------------------------
|
##³õʼ»¯³ðºÞÐÅÏ¢µÈ
|
#@param curNPC NPCʵÀý
|
#@return ·µ»ØÖµÎÞÒâÒå
|
#@remarks ³õʼ»¯³ðºÞÐÅÏ¢µÈ
|
def DoInit(curNPC):
|
return
|
|
#---------------------------------------------------------------------
|
##ïÚ³µÄ£Ê½ÐÞ¸Ä
|
#@param curNPC NPCʵÀý
|
#@param tick ʱ¼ä´Á
|
#@return ·µ»ØÖµÎÞÒâÒå
|
#@remarks ïÚ³µÄ£Ê½ÐÞ¸Ä
|
def __ChangTruckMode(curNPC, tick):
|
if curNPC.GetMode() != IPY_GameWorld.trmStop:
|
#ÎÞÈ˵ÄïÚ³µ,ÉèÖÃΪֹͣģʽ
|
curNPC.SetMode(IPY_GameWorld.trmStop)
|
|
__ChangeTruckPos(curNPC, tick)
|
return
|
#---------------------------------------------------------------------
|
|
## ÖØÖÃÕϰµãÖеÄïÚ³µÎ»ÖÃ
|
# @param curTruck: ïÚ³µÊµÀý
|
# @param tick: ʱ¼ä´Á
|
# @return: None
|
def __ChangeTruckPos(curTruck, tick):
|
curTruckPosX = curTruck.GetPosX()
|
curTruckPosY = curTruck.GetPosY()
|
if GameWorld.GetMap().CanMove(curTruckPosX, curTruckPosY):
|
#µ±Ç°µã·ÇÕϰµã
|
return
|
|
posX, posY = GameMap.GetPosByMatrix(curTruckPosX, curTruckPosY,
|
ChConfig.Def_Matrix_Three)
|
curTruck.SetCurAction(IPY_GameWorld.laNPCMove)
|
curTruck.SetCurMoveType(IPY_GameWorld.mtNormal)
|
curTruck.Move(posX, posY)
|
|
#Çå³ýÓÐÏÞÎÞµÐbuff
|
__ClearLimitSuperBuff(curTruck, tick)
|
return
|
|
|
## Çå³ýÓÐÏÞÎÞµÐbuff
|
# @param curTruck: ïÚ³µÊµÀý
|
# @param tick: ʱ¼ä´Á
|
# @return: None
|
def __ClearLimitSuperBuff(curTruck, tick):
|
|
tick = GameWorld.GetGameWorld().GetTick()
|
|
BuffSkill.DelBuffBySkillID(curTruck, ChConfig.Def_SkillID_LimitSuperBuff, tick)
|
|
|
## »ñÈ¡ïÚ³µÒƶ¯×ø±ê
|
# @param curTruck: ïÚ³µÊµÀý
|
# @return: posX, posY
|
def __GetTruckMovePos(curPlayer):
|
gameMap = GameWorld.GetMap()
|
playerPosX = curPlayer.GetPosX()
|
playerPosY = curPlayer.GetPosY()
|
|
if gameMap.CanMove(playerPosX, playerPosY):
|
return playerPosX, playerPosY
|
|
moveDestX, moveDestY = GameMap.GetPosByMatrix(curPlayer.GetPosX(),
|
curPlayer.GetPosY(),
|
ChConfig.MatrixDict[2])
|
return moveDestX, moveDestY
|
|