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