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