| #!/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 GameObj.GetHP(curNPC) <= 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 GameObj.GetHP(curPlayer) <= 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  | 
|   |