#!/usr/bin/python # -*- coding: GBK -*- #--------------------------------------------------------------------- # #--------------------------------------------------------------------- ##@package BaseAttack # @todo: ¹¥»÷Âß¼­µ÷¶ÈÆ÷ # # @author: eggxp # @date 2011-10-09 # @version 1.0 # # @note: ´¦ÀíËùÓеĹ¥»÷Âß¼­ #--------------------------------------------------------------------- # #--------------------------------------------------------------------- #"""Version = 2016-12-30 20:00""" #--------------------------------------------------------------------- import AttackCommon import GameWorld import IPY_GameWorld import PlayerControl import NPCCommon import ChConfig import SkillCommon import AttackLogic import ItemControler import ItemCommon import BuffSkill import FBLogic import SkillShell import EventShell import PetControl import random import OperControlManager import DataRecordPack import ChItem import GameObj import ChPyNetSendPack import ChNetSendPack import NetPackCommon import PassiveBuffEffMng import PlayerGeTui import IpyGameDataPY #--------------------------------------------------------------------- g_skillHurtList = IPY_GameWorld.IPY_HurtList() # ÌØÊâ´¦ÀíËÑË÷·¶Î§£¬Ò»°ãÓÃÓÚ¸±±¾ Def_SearchMap_NPC = 200 # ±¾ÏßȫͼËÑË÷NPC Def_SearchMap_Player = 201 # ±¾ÏßȫͼËÑË÷Íæ¼Ò #É˺¦½á¹¹Ìå #hurtTypeIndance = None #--------------------------------------------------------------------- #µ¼ÈëËùÓеĹ¥»÷Ä£¿é GameWorld.ImportAll("Script\\Attack\\", "AttackLogic") GameWorld.ImportAll("Script\\Attack\\", "") #--------------------------------------------------------------------- ## ÖØÐ¶ÁÈ¡ËùÓй¥»÷Âß¼­ # @param tick µ±Ç°tick # @return ·µ»ØNone # @remarks º¯ÊýÏêϸ˵Ã÷. def ReloadAttack(tick): scriptPath = ChConfig.GetAppPath() + "Script\\Attack\\AttackLogic" GameWorld.ReloadScript(scriptPath, "AttackLogic") scriptPath = ChConfig.GetAppPath() + "Script\\Attack" GameWorld.ReloadScript(scriptPath, "") return #------------------------------------------------------------------ ### ÉèÖÃÉ˺¦½á¹¹Ìå ## @param indance É˺¦½á¹¹Ìå ## @return ·µ»ØÖµËµÃ÷ ## @remarks º¯ÊýÏêϸ˵Ã÷. #def __SetHurtIndance(indance): # global hurtTypeIndance # hurtTypeIndance = indance # ### »ñµÃ±¾´Î¹¥»÷ÊÇ·ñÊDZ©»÷ ## @param ÎÞ²ÎÊý ## @return True or False ## @remarks º¯ÊýÏêϸ˵Ã÷. #def GetIsSuperHit(): # #Òì³£ # if hurtTypeIndance == None: # #GameWorld.Log("»ñȡȫ¾Ö±äÁ¿hurttypeʧ°Ü") # return ChConfig.Def_HurtType_Normal # # return hurtTypeIndance.HurtType == ChConfig.Def_HurtType_SuperHit # ### »ñµÃ±¾´Î¹¥»÷ÊÇ·ñÊÇMiss ## @param ÎÞ²ÎÊý ## @return True or False ## @remarks º¯ÊýÏêϸ˵Ã÷. #def GetIsMiss(): # #Òì³£ # if hurtTypeIndance == None: # #GameWorld.Log("»ñȡȫ¾Ö±äÁ¿hurttypeʧ°Ü") # return ChConfig.Def_HurtType_Normal # # return hurtTypeIndance.HurtType == ChConfig.Def_HurtType_Miss # ### »ñµÃ±¾´Î¹¥»÷É˺¦µÄѪ ## @param ÎÞ²ÎÊý ## @return ÉËѪֵ ## @remarks º¯ÊýÏêϸ˵Ã÷. #def GetLostHP(): # #Òì³£ # if hurtTypeIndance == None: # #GameWorld.Log("»ñȡȫ¾Ö±äÁ¿hurttypeʧ°Ü") # return 0 # # return hurtTypeIndance.HurtHP #------------------------------------------------------------------ ## »ñµÃ¹¥»÷·½Ãû×Ö(²ÎÊý -> µ±Ç°¶ÔÏó) # @param obj IPY_GameObj # @return ObjÀàÐÍ strÐÍ # @remarks º¯ÊýÏêϸ˵Ã÷. def GetObjAttackName(obj): curObjType = obj.GetGameObjType() result = "Unknown" if curObjType == IPY_GameWorld.gotPlayer: result = "Player" elif curObjType == IPY_GameWorld.gotNPC: npcObjType = obj.GetGameNPCObjType() npcType = obj.GetType() if npcType == IPY_GameWorld.ntGuard: #ÊØÎÀ, GetType()ÊÇÈ¡µÃ±íÖеÄtype result = "Guard" elif npcType == IPY_GameWorld.ntFunctionNPC: #¹¦ÄÜNPC result = "FuncNPC" elif npcType == IPY_GameWorld.ntDeer: #¹ result = "Deer" elif npcType == IPY_GameWorld.ntDefenceMax: #ÎÞÏÞ·ÀÓùµÄ¹ÖÎï result = "DefenceMaxNPC" elif npcType == IPY_GameWorld.ntGoldenEgg: #½ðµ° result = "GoldenEgg" elif npcObjType == IPY_GameWorld.gnotNormal: #ÆÕͨ¹Ö GetGameObjType() ÊÇÈ¡µÃ³ÌÐòÖÐÅж¨µÄtype result = "NormalNPC" elif npcObjType == IPY_GameWorld.gnotSummon: #ÕÙ»½ if hasattr(obj, "GetOwner") and obj.GetOwner() != None: result = "SummonNPC" else: result = "NormalNPC" elif npcObjType == IPY_GameWorld.gnotTruck: #æô³µ result = "Truck" elif npcObjType == IPY_GameWorld.gnotPet: #³èÎï result = "Pet" return result #------------------------------------------------------------------ ## »ñµÃÊÇ·ñ¿ÉÒÔ¹¥»÷(²ÎÊý -> ¹¥»÷·½,·ÀÊØ·½,¼¼ÄÜ(ÎÞ -> None),µ±Ç°Ê±¼ä) # @param attacker ¹¥»÷Obj # @param defender ·ÀÓùObj # @param skill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @return Ture or Flase µ±Ç°Ê±¿ÌÄÜ·ñ¹¥»÷ # @remarks ͨ¹ýµ÷Óà Obj_Attack_Obj.GetCanAttack »ñÈ¡·µ»ØÖµ def GetCanAttack(attacker, defender, skill, tick): callFunc = GameWorld.GetExecFunc( AttackLogic, "%s_Attack_%s.%s" % ( GetObjAttackName(attacker), GetObjAttackName(defender), "GetCanAttack") ) if not callFunc: #GameWorld.Log( "%d GetCanAttack %d Error !"%( attacker.GetID(), defender.GetID() ) ) return False return callFunc(attacker, defender, skill, tick) #------------------------------------------------------------------ ## »ñȡ˫·½¹ØÏµ # @param attacker ¹¥»÷Obj # @param defender ·ÀÓùObj # @param skill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @return ChConfig.Type_Relation_Enemy µÐÓѹØÏµ , ChConfig.Def_PASysMessage_None ¹¥»÷ϵͳÌáʾ # @remarks ͨ¹ýµ÷Óà Obj_Attack_Obj.GetTagRelation »ñÈ¡·µ»ØÖµ def GetTagRelation(attacker, defender, skill, tick): #GameWorld.Log("¹¥»÷·½ = %s,·ÀÊØ·½ = %s"%(GetObjAttackName(attacker),GetObjAttackName(defender))) callFunc = GameWorld.GetExecFunc( AttackLogic, "%s_Attack_%s.%s" % ( GetObjAttackName(attacker), GetObjAttackName(defender), "GetTagRelation") ) if not callFunc: #GameWorld.Log("%d GetTagRelation %d Error !"%( attacker.GetID(), defender.GetID() ) ) return ChConfig.Type_Relation_None , ChConfig.Def_PASysMessage_None return callFunc(attacker, defender, skill, tick) def GetSkillHurtList(): global g_skillHurtList return g_skillHurtList def GetFirstHurtObj(): global g_skillHurtList if g_skillHurtList.GetHurtCount(): return g_skillHurtList.GetHurtAt(0) return None # ´¥·¢Ðͼ¼Äܸù¾ÝÉËѪÀàÐÍ´¥·¢±»¶¯¼¼ÄÜ£¬Èº¹¥Ö»´¥·¢Ò»´Î£¬·ÅÔÚÉËѪÁÐ±í±»Çå֮ǰ # Ö»´¦Àí isEnhanceSkillµÄÇé¿ö£¬¶ÔÓ¦ OnHurtTypeTriggerSkill def OnHurtTypeTriggerPassiveSkill(attacker, target, curSkill, tick): AttackCommon.ClearFirstDefender(attacker) skillHurtLists = [] # ÄÚ²¿´¥·¢Çå³ýg_skillHurtList for i in xrange(g_skillHurtList.GetHurtCount()): hurtObj = g_skillHurtList.GetHurtAt(i) if not hurtObj: continue skillHurtLists.append([hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType()]) #Ö»¶ÔµÚһĿ±êÔì³ÉijÉ˺¦ÀàÐÍʱ´¥·¢¼¼ÄÜ£¬ ÐèÏÈ´æ´¢ skillHurtLists OnHurtTypeTriggerSkillFirstObj(attacker, curSkill, tick) for hurtList in skillHurtLists: defender = GameWorld.GetObj(hurtList[0], hurtList[1]) if not defender: continue if GameObj.GetHP(defender) > 0: continue if hurtList[1] == IPY_GameWorld.gotPlayer: if hurtList[2] == ChConfig.Def_HurtType_Zhansha: defender.SetDict(ChConfig.Def_PlayerKey_Zhansha, 1) elif hurtList[2] == ChConfig.Def_HurtType_ZhognjiZhansha: defender.SetDict(ChConfig.Def_PlayerKey_Zhansha, 2) # ±ôËÀ״̬´¥·¢¼¼ÄÜ, ²»ÄÜÔÚGetHurtHPÄÚ²¿´¥·¢¼¼ÄÜ£¬·ñÔò»áµ¼ÖÂÔ­¼¼ÄܵÄÉËѪÁбíÒì³£ PassiveBuffEffMng.OnPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_WillDead, tick) PassiveBuffEffMng.OnPassiveBuffTrigger(defender, attacker, None, ChConfig.TriggerType_WillDead, tick) if hurtList[2] in [ChConfig.Def_HurtType_Zhansha, ChConfig.Def_HurtType_ZhognjiZhansha]: defender.SetDict(ChConfig.Def_PlayerKey_Zhansha, 0) #--------------------------------------------------------------------- ## ¹¥»÷ͨÓú¯Êý # @param attacker ¹¥»÷Obj # @param defender ·ÀÓùObj # @param skill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @param skillPercent ¼¼ÄÜÔöÇ¿°Ù·Ö±È # @param skillEnhance ¼¼ÄÜÔöǿֵ # @param attackTime ¹¥»÷´ÎÊý # @param isEnhanceSkill ÊÇ·ñΪ¸½¼Ó¼¼ÄÜ # @return True ¹¥»÷³É¹¦ None ²»¿É¹¥»÷ # @remarks ͨ¹ýµ÷Óà Obj_Attack_Obj.GetTagRelation »ñÈ¡·µ»ØÖµ def Attack(attacker, defender, useSkill, tick, skillPercent=10000, skillEnhance=0, attackTime=1, isEnhanceSkill=False): global g_skillHurtList if attacker.GetGameObjType() == IPY_GameWorld.gotNPC: #NpcÔÚ·ÀÒ»´Î¹¥»÷ÏÞÖÆ, ·ÀֹѣÔÎʱÄܽøÐÐÆÕ¹¥ if not OperControlManager.IsObjCanDoAction(attacker, ChConfig.Def_Obj_ActState_ServerSkill, ChConfig.Def_Action_Attack_Bit): return False #ÅжϹ¥»÷¶ÔÏóÊÇ·ñΪµÐÈË if not GetCanAttack(attacker, defender, useSkill, tick): #GameWorld.Log("²»¿É¹¥»÷") return False #=========================================================================== # #²»¿ÉÐнøÍ¨µÀ²»¹¥»÷ # if not AttackCommon.CanAttackByPath(attacker, defender): # return #=========================================================================== #Íæ¼Ò¹ØÏµÂß¼­ÔÚÍâ²ãÂß¼­Åж¨,NPC¹¥»÷¹ØÏµÔÚÄÚ²ãÅж¨ if attacker.GetGameObjType() == IPY_GameWorld.gotNPC: #ÅжÏÊÇ·ñµÐ¶Ô¹ØÏµ relation = GetTagRelation(attacker, defender, useSkill, tick)[0] if relation != ChConfig.Type_Relation_Enemy: #GameWorld.Log("curTagName = %s ²»ÊǵжԹØÏµ"%(curTag.GetName())) return callFunc = GameWorld.GetExecFunc(AttackLogic, "%s_Attack_%s.%s" % ( GetObjAttackName(attacker), GetObjAttackName(defender), "DoAttack")) if callFunc == None: GameWorld.Log("%d Attack %d Error !" % (attacker.GetID(), defender.GetID())) return False #¹¥»÷·½Ô­ÓÐѪÁ¿,ÓÃÀ´Í¨Öª·´µ¯ attackerHP = GameObj.GetHP(attacker) destX = defender.GetPosX() destY = defender.GetPosY() #¹¥»÷ǰÁ¬»÷¼ì²é SkillCommon.UpdateSkillCombo(attacker, useSkill, tick) # NPC±íÓÐÅäÖÃÆÕ¹¥µÄ¸½¼ÓÉ˺¦ if attacker.GetGameObjType() == IPY_GameWorld.gotNPC: skillEnhance += NPCCommon.GetSkillEnhance(attacker) # ¼¼Äܹ¥»÷Á¦¼Ó³É #GameWorld.Log("g_skillHurtList.Clear()") g_skillHurtList.Clear() #¸ù¾Ý¹¥»÷´ÎÊý,Ìí¼ÓÉËѪÁбí for i in range(0, attackTime): indance = callFunc(attacker, defender, useSkill, skillEnhance, skillPercent, g_skillHurtList, tick) #¹¹½¨Áбí # __SetHurtIndance(indance) #¸½¼Ó¼¼Äܲ»Ôٴδ¥·¢ if not isEnhanceSkill: #¹¥»÷½áÊø¶¯×÷ __AttackSuccess(attacker, attackerHP, defender, useSkill, tick) #µ÷Óô¥·¢¸½¼Ó¼¼ÄÜ SkillShell.DoLogic_UseEnhanceSkill(attacker, defender, useSkill, tick, destX, destY) else: OnHurtTypeTriggerPassiveSkill(attacker, defender, useSkill, tick) #Òò¹¥»÷½áÊø¶¯×÷ÖУ¬·¨±¦¹¥»÷½«µ¼ÖÂÄ¿±êËÀÍö¡£ÒªÅж¨ºóÔڴε÷Ó㬱ÜÃâ2´Î->AttackResult if AttackCommon.GetIsDead(defender): return False DoLogic_AttackResult(attacker, defender, useSkill, tick) return True #--------------------------------------------------------------------- ##Ö´Ðй¥»÷³É¹¦½áÊøÂß¼­ # @param index Íæ¼ÒË÷Òý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Ö´Ðй¥»÷³É¹¦½áÊøÂß¼­ def DoLogic_AttackResult(attacker, defender, useSkill, tick): resultFunc = GameWorld.GetExecFunc(AttackLogic, "%s_Attack_%s.%s" % ( GetObjAttackName(attacker), GetObjAttackName(defender), "AttackResult")) if not resultFunc: GameWorld.Log("%d AttackResult %d Error !" % (attacker.GetID(), defender.GetID())) return False if GameObj.GetHP(defender) <= 0: defender.SetDict(ChConfig.Def_NPCDead_KillerType, attacker.GetGameObjType()) defender.SetDict(ChConfig.Def_NPCDead_KillerID, attacker.GetID()) #PlayerGeTui.TJGDead(defender, attacker.GetName()) if defender.GetGameObjType() == IPY_GameWorld.gotNPC: skillID = 0 if not useSkill else useSkill.GetSkillID() # ¼Ç¼ËÀÍöÔ­Òò defender.SetDict(ChConfig.Def_NPCDead_Reason, skillID) resultFunc(attacker, defender, useSkill, tick) #Ö´Ðб»¹¥»÷Âß¼­ DoBeAttackOver(attacker, defender, useSkill, tick) return True #------------------------------------------------------------------ ## Ⱥ¹¥¶ªÆ¿×Ó # @param posX ¹¥»÷×ø±êX # @param posY ¹¥»÷×ø±êY # @return ·µ»ØNone # @remarks º¯ÊýÏêϸ˵Ã÷. def TestQun(posX, posY): curSingleItem = ItemCommon.CreateSingleItem(1) ChItem.AddMapDropItem(posX, posY, curSingleItem) return #--------------------------------------------------------------------- ## ¼ì²éÊÇ·ñ¿ÉÒÔ¹¥»÷ # @param attacker ¹¥»÷Obj # @param curTag ·ÀÓùObj # @param curSkill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @return True ¿ÉÒÔ¹¥»÷ None ²»¿É¹¥»÷ # @remarks º¯ÊýÏêϸ˵Ã÷. def __CheckCanAttack(attacker, curTag, curSkill, tick): #¶ÔÏó´æÔÚ if not curTag: return False if GameObj.GetHP(curTag) <=0 : return False #Èç¹û¹¥»÷³ÇÃÅ,³ÇÃÅÈç¹ûÔڹرÕ״̬,²»¿É¹¥»÷ if GameWorld.GetNPC_Is_Gate(curTag): #and GameWorld.GetGameFB().GetGameFBDictByKey("gate_is_close"): return False #GameWorld.Log("¹¥»÷ -> curTagName = %s"%(curTag.GetName())) #ÅжÏÊÇ·ñ¿ÉÒÔ¹¥»÷Õâ¸ö¶ÔÏó if not AttackCommon.CheckCanAttackTag(attacker, curTag): #GameWorld.Log("curTagName = %s ²»¿É¹¥»÷"%(curTag.GetName())) return False #ÅжÏÊÇ·ñµÐ¶Ô¹ØÏµ relation = GetTagRelation(attacker, curTag, curSkill, tick)[0] if relation != ChConfig.Type_Relation_Enemy: #GameWorld.Log("curTagName = %s ²»ÊǵжԹØÏµ"%(curTag.GetName())) return False #¿É¹¥»÷µÄÒ°ÍâС¹Ö£¨º¬¾«Ó¢£©¹ÖÎï curSkillUseTag = SkillShell.GetSkillAffectTag(curSkill) if curSkillUseTag == ChConfig.Def_UseSkillTag_CanAttackBaseNPC: if curTag.GetGameObjType() != IPY_GameWorld.gotNPC: return False if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull: return False if curTag.GetIsBoss() > ChConfig.Def_NPCType_Ogre_Super: return False elif curSkillUseTag == ChConfig.Def_UseSkillTag_CanAttackPlayer: if curTag.GetGameObjType() != IPY_GameWorld.gotPlayer: return False return True #--------------------------------------------------------------------- ## Ç¿ÖÆÌí¼ÓÄ¿±ê # @param resultList ¹¥»÷Áбí # @param attacker ¹¥»÷Obj # @param defender ·ÀÓùObj # @param curSkill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @return resultList ¹¥»÷Áбí # @remarks º¯ÊýÏêϸ˵Ã÷. def __AddObj_In_resultList(resultList, attacker, defender, curSkill, tick): if not defender: return resultList # Ö÷Ä¿±ê¶ÔÏóÅж¨ curSkillUseTag = SkillShell.GetSkillAffectTag(curSkill) hurtTypeList = ChConfig.Def_Dict_UseSkillTag_ObjType.get(curSkillUseTag) if not hurtTypeList: return resultList if defender.GetGameObjType() not in hurtTypeList: return resultList #²»¿É¹¥»÷ if not __CheckCanAttack(attacker, defender, curSkill, tick): return resultList #²éÕÒÄ¿±êÊÇ·ñÔÚ¹¥»÷ÁбíÖÐ for curObj in resultList: if curObj.GetID() == defender.GetID(): #ÒѾ­´æÔÚÁË return resultList #ÊÖ¶¯Ìí¼Ó resultList.append(defender) return resultList #--------------------------------------------------------------------- ## ¼¼ÄÜÇøÓò¼ÓBuff # @param attacker ¹¥»÷ÕßʵÀý # @param defender ·ÀÓùÕßʵÀý # @param curSkill ¼¼ÄÜʵÀý # @param srcPosX Êͷż¼ÄÜÆðµã×ø±êX # @param srcPosY Êͷż¼ÄÜÆðµã×ø±êY # @param tick µ±Ç°Ê±¼ä # @param buffValue buffÖµ # @param isTeamBuff ÊÇ·ñ¶ÓÎé¼¼ÄÜ # @return True # @remarks º¯ÊýÏêϸ˵Ã÷. def SkillAddAreaBuff(attacker, defender, curSkill, srcPosX, srcPosY, tick, isTeamBuff=False, skillMatrix=None): #¹¥»÷·½¶ÔÏóÀàÐÍ attackObjType = attacker.GetGameObjType() curSkillTypeID = curSkill.GetSkillTypeID() curSkillLV = curSkill.GetSkillLV() buffType = SkillCommon.GetBuffType(curSkill) resultList = [] if isTeamBuff: #Íæ¼Ò¶ÓÎé resultList = PlayerControl.GetAreaTeamMember(attacker.GetTeam(), srcPosX, srcPosY) #Ìí¼Ó×Ô¼º resultList.append(attacker) else: #È¡µÃÊÜЧ¹ûÄ¿±ê¶ÓÁÐ resultList = __GetAreaAtackObj(attacker, curSkill, srcPosX, srcPosY, tick, CheckTagIsBeInfection, skillMatrix) #ÓÐÄ¿±êÀ༼ÄÜ,²éÕÒÖ¸¶¨µÄ¹¥»÷Ä¿±êÊÇ·ñÔÚÁбíÖÐ,²»ÔÚÌí¼Ó __AddObj_In_resultList(resultList, attacker, defender, curSkill, tick) for curTag in resultList: #ÓиüÇ¿´óµÄЧ¹û if not SkillCommon.CheckCanAddBuff(curTag, buffType, curSkillTypeID, curSkillLV): continue #Èç¹û¹¥»÷·½ÊÇÕÙ»½ÊÞ,Ìí¼ÓbuffÓµÓÐÕßÒªÊÇÕâ¸öÕÙ»½ÊÞµÄÖ÷ÈË addAngryObj = attacker if attackObjType == IPY_GameWorld.gotNPC and NPCCommon.IsSummonNPC(attacker): useSkillOwner = NPCCommon.GetSummonOwnerDetel(attacker) #ÕÒ²»µ½Ö÷È˾ÍÊÇ×Ô¼º if useSkillOwner != None: addAngryObj = useSkillOwner #addAngryObj = useSkillOwner addBuffValueList = SkillShell.GetAddBuffValue(attacker, curSkill, curTag) BuffSkill.DoAddBuff(curTag, buffType, curSkill, tick, addBuffValueList, addAngryObj) #Ìí¼ÓBUFFºó£º´¦Àí¼¼ÄÜЧ¹û£¬´¥·¢¸½¼Ó¼¼ÄÜ£¬¼ÓBUFFºó²úÉúµÄЧ¹û£¬³Í·£ºÍ³ðºÞ SkillShell.AddBuffOver(attacker, defender, curSkill, tick, False) #GameWorld.Log("%sʹÓÃÇøÓòBuff¼¼ÄÜ = %s,³É¹¦,buff×ÜÖµ = %s"%(useSkillobj.GetName(), #curSkill.GetSkillName(),buffValue)) return True def SkillAddAuraBuff(curObjDetel, curSkill, tick): '''¹â»·buff¹âÔ´¶Ô¸½½üµ¥Î»Ó°ÏìÌí¼Óbuff''' attackDis = curSkill.GetAtkRadius() # ÓÐÅäÖÃЧ¹û°ë¾¶µÄ×ß³£¹æÂß¼­ if attackDis: return SkillAddAreaBuff(curObjDetel, None, curSkill, curObjDetel.GetPosX(), curObjDetel.GetPosY(), tick) # ûÓÐÅäÖÃЧ¹û°ë¾¶µÄ´ú±íȫͼÓÐЧ, ÔÝʱֻ×öÖ§³ÖNPC if curObjDetel.GetGameObjType() != IPY_GameWorld.gotNPC: return False resultList = [] curSkillUseTag = SkillShell.GetSkillAffectTag(curSkill) # ¶ÔNPCµÄ if curSkillUseTag in [ChConfig.Def_UseSkillTag_FriendNPC, ChConfig.Def_UseSkillTag_CanAttackNPC]: isFriendObj = curSkillUseTag == ChConfig.Def_UseSkillTag_FriendNPC gameNPCManager = GameWorld.GetNPCManager() for index in xrange(gameNPCManager.GetNPCCount()): curNPC = gameNPCManager.GetNPCByIndex(index) if curNPC.GetID() == 0: continue if curNPC.GetGameNPCObjType() not in [IPY_GameWorld.gnotNormal, IPY_GameWorld.gnotSummon]: continue if isFriendObj != (curNPC.GetCountry() == curObjDetel.GetCountry()): continue resultList.append(curNPC) # ¶ÔÍæ¼ÒµÄ£¬´ýÀ©Õ¹ elif curSkillUseTag in [ChConfig.Def_UseSkillTag_PlayerHasHP, ChConfig.Def_UseSkillTag_CanAttackPlayer]: pass else: return False curSkillTypeID = curSkill.GetSkillTypeID() curSkillLV = curSkill.GetSkillLV() buffType = SkillCommon.GetBuffType(curSkill) for curTag in resultList: if not SkillCommon.CheckCanAddBuff(curTag, buffType, curSkillTypeID, curSkillLV): continue #GameWorld.DebugLog("¹âÔ´Ó°ÏìÌí¼ÓÖÜΧ¶ÔÏóbuff: curID=%s,tagID=%s,curSkillTypeID=%s" % (curObjDetel.GetID(), curTag.GetID(), curSkillTypeID)) addBuffValueList = SkillShell.GetAddBuffValue(curObjDetel, curSkill, curTag) BuffSkill.DoAddBuff(curTag, buffType, curSkill, tick, addBuffValueList, curObjDetel) SkillShell.AddBuffOver(curObjDetel, curTag, curSkill, tick, False) return True ## ¼ì²éÊDz»ÊDZ»Ó°ÏìµÄÄ¿±ê # @param attacker ¹¥»÷ÕßʵÀý # @param defender ·ÀÓùÕßʵÀý # @param curSkill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @return ²¼¶ûÖµ # @remarks ¼ì²éÊDz»ÊDZ»Ó°ÏìµÄÄ¿±ê def CheckTagIsBeInfection(attacker, defender, curSkill, tick): if attacker.GetGameObjType() == IPY_GameWorld.gotNPC: return CheckNPCSkillTagIsBeInfection(attacker, curSkill, defender, tick) #¼ì²éÄ¿±ê return SkillShell.CheckTag_DoPlayerUseSkillTag(attacker, curSkill, defender, tick) def CheckNPCSkillTagIsBeInfection(attacker, curSkill, defender, tick): curSkillUseTag = SkillShell.GetSkillAffectTag(curSkill) if curSkillUseTag == ChConfig.Def_UseSkillTag_FriendNPC: if defender.GetGameObjType() != IPY_GameWorld.gotNPC: return False #¹ØÏµ relation = GetTagRelation(attacker, defender, curSkill, tick) return relation[0] == ChConfig.Type_Relation_Friend elif curSkillUseTag == ChConfig.Def_UseSkillTag_AppointNPC: if defender and GameObj.GetHP(defender) > 0 : return True return False return __CheckCanAttack(attacker , defender , curSkill , tick) ## Ⱥ¹¥µô¹Ì¶¨ÑªÁ¿ # @param attacker ¹¥»÷ÕßʵÀý # @param defender ·ÀÓùÕßʵÀý # @param srcPosX ¹¥»÷Æðµã×ø±êX # @param srcPosX ¹¥»÷Æðµã×ø±êY # @param curSkill ¼¼ÄÜʵÀý # @param lostHP ¹Ì¶¨µôѪÁ¿ # @param tick µ±Ç°Ê±¼ä # @param isExSkill ÊÇ·ñÊǸ½¼Ó¼¼ÄÜ, ¸½¼Ó¼¼Äܲ»Í¨Öª¹¥»÷³É¹¦, Ò²²»Ôٴδ¥·¢ÆäËû¸½¼Ó¼¼ÄÜ # @param skillMatrix ¹¥»÷¾ØÕó # @return True def AreaSkillAttackLostHP(attacker, defender, srcPosX, srcPosY, curSkill, lostHP, tick, isExSkill=False, skillMatrix=None): #Çå¿ÕÉËѪÁбí global g_skillHurtList g_skillHurtList.Clear() #¹¥»÷·½Ô­ÓÐѪÁ¿,ÓÃÀ´Í¨Öª·´µ¯ attackerHP = GameObj.GetHP(attacker) resultList = __GetAreaAtackObj(attacker, curSkill, srcPosX, srcPosY, tick, __CheckCanAttack, skillMatrix) #ÓÐÄ¿±êÀ༼ÄÜ,²éÕÒÖ¸¶¨µÄ¹¥»÷Ä¿±êÊÇ·ñÔÚÁбíÖÐ,²»ÔÚÌí¼Ó resultList = __AddObj_In_resultList(resultList, attacker, defender, curSkill, tick) #Ö´Ðй¥»÷½á¹û for obj in resultList: SkillCommon.SkillLostHP(obj, curSkill.GetSkillTypeID(), attacker, lostHP, tick, isDoAttackResult=False) __DoAreaAttackResult(attacker, defender, curSkill, resultList, attackerHP, tick, isExSkill) return # Ë«·½ÔÚͬһÕŵØÍ¼£¬Õý³£Èº¹¥£¬µ«Í¨ÖªÒÔ±»¹¥»÷¶ÔÏóΪÊÍ·ÅÕߣ¬ÈçÖж¾ºó±¬Õ¨Á½Õß¾àÀë¹ýÔ¶ def AttackAreaDefenderNotify(attacker, defender, srcPosX, srcPosY, curSkill, skillPercent, skillEnhance, tick): #Çå¿ÕÉËѪÁбí global g_skillHurtList g_skillHurtList.Clear() #resultList = CheckAreaObjServer(attacker, curSkill, srcPosX, srcPosY, tick, __CheckCanAttack, None) #ÓÐÄ¿±êÀ༼ÄÜ,²éÕÒÖ¸¶¨µÄ¹¥»÷Ä¿±êÊÇ·ñÔÚÁбíÖÐ,²»ÔÚÌí¼Ó #resultList = __AddObj_In_resultList(resultList, attacker, defender, curSkill, tick) #GameWorld.Log("ʹÓÃÎÞÖ¸¶¨´ÎÊýȺ¹¥¼¼ÄÜ = %s ³É¹¦,¸½¼Ó¼¼ÄÜЧ¹û = %s,¸½¼Ó¼¼ÄÜÔöÇ¿ = %s"%\ #(curSkill.GetSkillName(),skillValue,skillPer)) resultList = [defender] __DoAreaAttack(attacker, curSkill, skillEnhance, skillPercent, resultList, [], g_skillHurtList, tick) # ·ÀÊØÕß×Ô¼ºÍ¨Öª __Sync_AttackResult(defender, defender, curSkill) OnHurtTypeTriggerPassiveSkill(attacker, defender, curSkill, tick) DoLogic_AttackResult(attacker, defender, curSkill, tick) return True # °Ù·Ö±ÈµôѪ def AttackAreaByHPPer(attacker, defender, srcPosX, srcPosY, curSkill, skillPercent, skillEnhance, tick, isExSkill = False, skillMatrix = None): #Çå¿ÕÉËѪÁбí global g_skillHurtList g_skillHurtList.Clear() #¹¥»÷·½Ô­ÓÐѪÁ¿,ÓÃÀ´Í¨Öª·´µ¯ attackerHP = GameObj.GetHP(attacker) resultList = __GetAreaAtackObj(attacker, curSkill, srcPosX, srcPosY, tick, __CheckCanAttack, skillMatrix) #ÓÐÄ¿±êÀ༼ÄÜ,²éÕÒÖ¸¶¨µÄ¹¥»÷Ä¿±êÊÇ·ñÔÚÁбíÖÐ,²»ÔÚÌí¼Ó resultList = __AddObj_In_resultList(resultList, attacker, defender, curSkill, tick) #GameWorld.Log("ʹÓÃÎÞÖ¸¶¨´ÎÊýȺ¹¥¼¼ÄÜ = %s ³É¹¦,¸½¼Ó¼¼ÄÜЧ¹û = %s,¸½¼Ó¼¼ÄÜÔöÇ¿ = %s"%\ #(curSkill.GetSkillName(),skillValue,skillPer)) attackList = __DoAreaAttackByHPPer(attacker, curSkill, skillEnhance, skillPercent, resultList, g_skillHurtList, tick) __DoAreaAttackResult(attacker, defender, curSkill, attackList, attackerHP, tick, isExSkill) return True ## Ö´ÐÐȺ¹¥¹¥»÷, ѪÁ¿°Ù·Ö±ÈÖ¸¶¨µôѪ£¬²»×ß¹«Ê½ def __DoAreaAttackByHPPer(attacker, curSkill, skillEnhance, skillPercent, resultList, g_skillHurtList, tick): attackList = [] #±»¹¥»÷¶ÔÏóÁбí #Ö´Ðй¥»÷½á¹û for obj in resultList: callName = "%s_Attack_%s.%s" % (GetObjAttackName(attacker), GetObjAttackName(obj), "DoAttack") callFunc = GameWorld.GetExecFunc(AttackLogic, callName) if not callFunc: continue # ÿ¸ö¶ÔÏóµÄ°Ù·Ö±ÈµôѪ skillEnhance = int(skillPercent*GameObj.GetMaxHP(obj) + skillEnhance) callFunc(attacker, obj, curSkill, skillEnhance, 0, g_skillHurtList, tick) attackList.append(obj) return attackList #defender : ¹¥»÷Æðµã ## ÇøÓò¹¥»÷ͨÓú¯Êý # @param attacker ¹¥»÷ÕßʵÀý # @param defender ·ÀÓùÕßʵÀý # @param srcPosX ¹¥»÷Æðµã×ø±êX # @param srcPosX ¹¥»÷Æðµã×ø±êY # @param curSkill ¼¼ÄÜʵÀý # @param skillPercent ¼¼ÄÜÔöÇ¿°Ù·Ö±È # @param skillEnhance ¼¼ÄÜÔöǿֵ # @param tick µ±Ç°Ê±¼ä # @param powerList Ë¥¼õ»òÔöÇ¿Áбí[ [skillPercent,skillEnhance],...... ] # @param isExSkill ÊÇ·ñÊǸ½¼Ó¼¼ÄÜ, ¸½¼Ó¼¼Äܲ»Í¨Öª¹¥»÷³É¹¦, Ò²²»Ôٴδ¥·¢ÆäËû¸½¼Ó¼¼ÄÜ # @param skillMatrix ¹¥»÷¾ØÕó # @param isAverageHurt ÊÇ·ñ¾ù·ÖÉ˺¦ # @return True # @remarks º¯ÊýÏêϸ˵Ã÷. def AttackerSkillAttackArea(attacker, defender, srcPosX, srcPosY, curSkill, skillPercent, skillEnhance, tick, powerList=[], isExSkill = False, skillMatrix = None, isAverageHurt = False): #Çå¿ÕÉËѪÁбí global g_skillHurtList g_skillHurtList.Clear() #¹¥»÷·½Ô­ÓÐѪÁ¿,ÓÃÀ´Í¨Öª·´µ¯ attackerHP = GameObj.GetHP(attacker) resultList = __GetAreaAtackObj(attacker, curSkill, srcPosX, srcPosY, tick, __CheckCanAttack, skillMatrix) #ÓÐÄ¿±êÀ༼ÄÜ,²éÕÒÖ¸¶¨µÄ¹¥»÷Ä¿±êÊÇ·ñÔÚÁбíÖÐ,²»ÔÚÌí¼Ó resultList = __AddObj_In_resultList(resultList, attacker, defender, curSkill, tick) #GameWorld.Log("ʹÓÃÎÞÖ¸¶¨´ÎÊýȺ¹¥¼¼ÄÜ = %s ³É¹¦,¸½¼Ó¼¼ÄÜЧ¹û = %s,¸½¼Ó¼¼ÄÜÔöÇ¿ = %s"%\ #(curSkill.GetSkillName(),skillValue,skillPer)) # ¾ù·ÖÉ˺¦ if isAverageHurt: resultCnt = len(resultList) if resultCnt > 0: skillPercent /= resultCnt skillEnhance /= resultCnt attackList = __DoAreaAttack(attacker, curSkill, skillEnhance, skillPercent, resultList, powerList, g_skillHurtList, tick) __DoAreaAttackResult(attacker, defender, curSkill, attackList, attackerHP, tick, isExSkill) return True # °´ÏÉÃ˳ÉÔ±¾ù̯É˺¦ def AttackerSkillAttackAreaByFamily(attacker, defender, srcPosX, srcPosY, curSkill, skillPercent, skillEnhance, tick, isExSkill = False): #Çå¿ÕÉËѪÁбí global g_skillHurtList g_skillHurtList.Clear() #¹¥»÷·½Ô­ÓÐѪÁ¿,ÓÃÀ´Í¨Öª·´µ¯ attackerHP = GameObj.GetHP(attacker) resultList = __GetAreaAtackObj(attacker, curSkill, srcPosX, srcPosY, tick, __CheckCanAttack) #ÓÐÄ¿±êÀ༼ÄÜ,²éÕÒÖ¸¶¨µÄ¹¥»÷Ä¿±êÊÇ·ñÔÚÁбíÖÐ,²»ÔÚÌí¼Ó resultList = __AddObj_In_resultList(resultList, attacker, defender, curSkill, tick) # ¼ÆËãÏÉÃ˳ÉÔ±ÊýÁ¿, °´ÈËÍ·¾ù̯É˺¦ resultDict = {} for obj in resultList: if obj.GetGameObjType() != IPY_GameWorld.gotPlayer: continue familyID = obj.GetFamilyID() if familyID not in resultDict: resultDict[familyID] = [] resultDict[familyID].append(obj) skillEffect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_AvgHurtFMCnt) minSkillPer = 0.01 # Èç¹ûδÅäÖÃĬÈÏ×îµÍÖµ if skillEffect: minSkillPer = skillEffect.GetEffectValue(0) attackList = [] for familyID in resultDict: cnt = len(resultDict[familyID]) if familyID != 0 else 1 # ÎÞÏÉÃ˳ÐÊÜ100%É˺¦ skillPercent = max(skillPercent/cnt, minSkillPer) attackList.extend(__DoAreaAttack(attacker, curSkill, skillEnhance/cnt, skillPercent, resultDict[familyID], [], g_skillHurtList, tick)) __DoAreaAttackResult(attacker, defender, curSkill, attackList, attackerHP, tick, isExSkill) return True # ´¥·¢¼¼ÄܵÄÀàÐÍΪ µ¥Ìå¹¥»÷£¬»òÕßµ¥Ìåbuff²¢ÇҷǶÔ×Ô¼ºÊͷŵļ¼ÄÜ£¬¿ÉÒÔ¶ÔÉ˺¦Ä¿±êÒ»Ò»Ö´Ðд¥·¢¼¼ÄÜÂß¼­ # ·ñÔòÖ»´¥·¢Ò»´Î¼¼ÄÜ # ȺÌåBUFFµÄÇë²Î¿¼IsPlayerUseSkill ¿Í»§¶Ë¾ö¶¨¶ÔÏó£¬Ò»Ñù¿ÉÒÔʵÏÖͬÑùЧ¹û # ·µ»ØÕæ±íʾ¿ÉÒÔ¶Ôÿ¸öÉ˺¦Ä¿±ê´¥·¢£¬·µ»Ø¼ÙÔòΪµ¥Ìå def GetIsEnhanceSkillGroup(curSkill, enhanceSkillID): if not enhanceSkillID: return False enhanceSkill = GameWorld.GetGameData().FindSkillByType(enhanceSkillID, curSkill.GetSkillLV()) if not enhanceSkill: return False if enhanceSkill.GetAtkType() == 1: return True if SkillCommon.IsBuff(enhanceSkill) and enhanceSkill.GetAtkType() == 0 and \ SkillShell.GetSkillAffectTag(enhanceSkill) not in [ChConfig.Def_UseSkillTag_Self, ChConfig.Def_UseSkillTag_SelfAndFriend]: return True return False ## Ö´ÐÐȺ¹¥»÷½á¹û # @param attacker ¹¥»÷ÕßʵÀý # @param defender ·ÀÓùÕßʵÀý # @param curSkill ¼¼ÄÜʵÀý # @param attackList ¹¥»÷¶ÔÏóÁбí # @param attackerHP ¹¥»÷·½HP ÓÃÓÚ֪ͨÉËѪ·´µ¯ # @param tick µ±Ç°Ê±¼ä # @param isEnhanceSkill ÊÇ·ñÊǸ½¼Ó¼¼ÄÜ, ¸½¼Ó¼¼Äܲ»Í¨Öª¹¥»÷³É¹¦, Ò²²»Ôٴδ¥·¢ÆäËû¸½¼Ó¼¼ÄÜ # @return ÎÞ # @remarks º¯ÊýÏêϸ˵Ã÷.Ö´ÐÐȺ¹¥»÷½á¹û def __DoAreaAttackResult(attacker, defender, curSkill, attackList, attackerHP, tick, isEnhanceSkill): #·Ç¸½¼Ó¼¼ÄÜ´¦Àí if not isEnhanceSkill: # Ç¿ÖÆÉèÖÃÉËѪÁбíÀïijһ¶ÔÏóΪdefender, ¹¥»÷½áÊø´¦ÀíÐèÒªÓõ½ if not defender and attackList and attacker.GetGameObjType() == IPY_GameWorld.gotNPC: defender = attackList[0] #¹¥»÷½áÊø¶¯×÷³É¹¦ __AttackSuccess(attacker, attackerHP, defender, curSkill, tick) # ¸ù¾Ý´¥·¢¼¼ÄܵÄÌØµã¾ö¶¨ÊÇ´¥·¢Ò»´Î»¹ÊÇ ´¥·¢¶à´Î # ȺÌåBUFFµÄÇë²Î¿¼IsPlayerUseSkill ¿Í»§¶Ë¾ö¶¨¶ÔÏó£¬Ò»Ñù¿ÉÒÔʵÏÖͬÑùЧ¹û if curSkill: for enhanceSkillID in [curSkill.GetSkillEnhance1(), curSkill.GetSkillEnhance2()]: if GetIsEnhanceSkillGroup(curSkill, enhanceSkillID): for defObj in attackList: SkillShell.SkillTrigSkill(attacker, defObj, curSkill, enhanceSkillID, tick) else: SkillShell.SkillTrigSkill(attacker, defender, curSkill, enhanceSkillID, tick) else: OnHurtTypeTriggerPassiveSkill(attacker, defender, curSkill, tick) for defObj in attackList: #Òò¹¥»÷½áÊø¶¯×÷ÖУ¬·¨±¦¹¥»÷½«µ¼ÖÂÄ¿±êËÀÍö¡£ÒªÅж¨ºóÔڴε÷Ó㬱ÜÃâ2´Î->AttackResult if AttackCommon.GetIsDead(defObj): continue DoLogic_AttackResult(attacker, defObj, curSkill, tick) ## Ö´ÐÐȺ¹¥¹¥»÷ # @param attacker ¹¥»÷ÕßʵÀý # @param curSkill ¼¼ÄÜʵÀý # @param skillEnhance ¼¼ÄÜÔöǿֵ # @param skillPercent ¼¼ÄÜÔöÇ¿°Ù·Ö±È # @param resultList ¹¥»÷¶ÔÏóÁбí # @param powerList Ë¥¼õ»òÔöÇ¿Áбí[ [skillPercent,skillEnhance],...... ] # @param g_skillHurtList ÉËѪÁбí # @param tick µ±Ç°Ê±¼ä # @return ÎÞ # @remarks º¯ÊýÏêϸ˵Ã÷.Ö´ÐÐȺ¹¥¹¥»÷ def __DoAreaAttack(attacker, curSkill, skillEnhance, skillPercent, resultList, powerList, g_skillHurtList, tick): attackList = [] #±»¹¥»÷¶ÔÏóÁбí #checkComboOK = False #Ö´Ðй¥»÷½á¹û for obj in resultList: callName = "%s_Attack_%s.%s" % (GetObjAttackName(attacker), GetObjAttackName(obj), "DoAttack") callFunc = GameWorld.GetExecFunc(AttackLogic, callName) if not callFunc: continue #Èç¹ûÓÐË¥ÈõºÍÔöÇ¿µÄµÄЧ¹û£¬²»Ê¹ÓòÎÊý´«ÈëµÄ skillEnhance, skillPercent if powerList != []: skillPercent, skillEnhance = powerList.pop(0) #if not checkComboOK: #¹¥»÷ǰÁ¬»÷¼ì²é # SkillCommon.UpdateSkillCombo(attacker, curSkill, tick) # checkComboOK = True callFunc(attacker, obj, curSkill, skillEnhance, skillPercent, g_skillHurtList, tick) attackList.append(obj) return attackList #Ⱥ¹¥Ö÷Ä¿±ê def GetAreaAttackAim(attacker, curSkill, CheckFunc, tick): # Ⱥ¹¥Ôö¼Ó¶ÔÏóÖ÷ÒªÊÇΪÁËÈÃÑ¡ÖÐÄ¿±ê¸üÈÝÒ×±»»÷ÖÐ if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer: return None curTag = None if attacker.GetAttackMode() == IPY_GameWorld.amContest: # µ¥Ò»Ä¿±êËø¶¨Ä£Ê½ curTag = GameWorld.GetObj(attacker.GetDictByKey(ChConfig.Def_PlayerKey_SelectObjID), attacker.GetDictByKey(ChConfig.Def_PlayerKey_SelectObjType)) if not curTag: useSkillTagID = attacker.GetUseSkillTagID() useSkillTagType = attacker.GetUseSkillTagType() curTag = GameWorld.GetObj(useSkillTagID, useSkillTagType) if not curTag: return None if SkillShell.GetSkillAffectTag(curSkill) == ChConfig.Def_UseSkillTag_CanAttackNPC: if NPCCommon.GetNpcObjOwnerIsPlayer(curTag): #npcÖ÷ÈËÊÇÍæ¼Ò²»Äܹ¥»÷ return None if CheckFunc != None: #¼ì²éÊÇ·ñÊÜÓ°Ïì if not CheckFunc(attacker, curTag, curSkill, tick): return None return curTag # ¿Í»§¶ËËÑË÷Ä¿±ê def CheckAreaObjClient(attacker, curSkill, tick, CheckFunc=None): resultList = list() #¹¥»÷½á¹ûÁбí #---¼ì²é¹¥»÷Ä¿±êÀàÐÍ--- curSkillUseTag = SkillShell.GetSkillAffectTag(curSkill) hurtTypeList = ChConfig.Def_Dict_UseSkillTag_ObjType.get(curSkillUseTag) #ÕÒ²»µ½¹¥»÷¶ÔÏóÀàÐÍÔòÍ˳ö if hurtTypeList == None: GameWorld.ErrLog("Def_Dict_UseSkillTag_ObjType ûÓжÔÓ¦Ïî %s" % curSkillUseTag) return resultList #¼¼Äܹ¥»÷×î´óÊýÁ¿ #hurtCount = SkillCommon.GetSkillArea_Atk_Count(attacker, curSkill) hurtDict = SkillShell.GetClientHurtDict() for objInfo in hurtDict: curObjType = objInfo[1] #²»ÔÚÓ°Ïì¶ÔÏóÁбíÖÐ if curObjType not in hurtTypeList: continue #¹¥»÷¶ÔÏó curTag = GameWorld.GetObj(objInfo[0], curObjType) if not curTag: continue #·Ç×Ô¶¨Ò峡¾°²ÅÐèÒªÅÐ¶Ï if not attacker.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene): if curSkillUseTag == ChConfig.Def_UseSkillTag_CanAttackNPC: if NPCCommon.GetNpcObjOwnerIsPlayer(curTag): #npcÖ÷ÈËÊÇÍæ¼Ò²»Äܹ¥»÷ continue if GameWorld.GetDist(curTag.GetPosX(), curTag.GetPosY(), attacker.GetPosX(), attacker.GetPosY()) > attacker.GetSight(): # ×îÔ¶¾àÀë·À·¶ GameWorld.DebugLog("#--- ×îÔ¶¾àÀë·À·¶[%s-%s]"%(attacker.GetID(), curTag.GetID())) continue if CheckFunc != None: #¼ì²éÊÇ·ñÊÜÓ°Ïì if not CheckFunc(attacker, curTag, curSkill, tick): continue resultList.append(curTag) return resultList # ·þÎñÆ÷ËÑË÷Ä¿±ê def CheckAreaObjServer(attacker, curSkill, srcPosX, srcPosY, tick, CheckFunc=None, skillMatrix=None): resultList = list() #¹¥»÷½á¹ûÁбí #---¼ì²é¹¥»÷Ä¿±êÀàÐÍ--- curSkillUseTag = SkillShell.GetSkillAffectTag(curSkill) hurtTypeList = ChConfig.Def_Dict_UseSkillTag_ObjType.get(curSkillUseTag) #ÕÒ²»µ½¹¥»÷¶ÔÏóÀàÐÍÔòÍ˳ö if hurtTypeList == None: GameWorld.ErrLog("Def_Dict_UseSkillTag_ObjType ûÓжÔÓ¦Ïî %s" % curSkillUseTag) return resultList if skillMatrix == None: #×÷Ó÷¶Î§ ×÷ÓþØÕó attackDis = curSkill.GetAtkRadius() skillMatrix = ChConfig.MatrixDict.get(attackDis, None) if skillMatrix == None and attackDis not in [Def_SearchMap_Player, Def_SearchMap_NPC]: GameWorld.ErrLog("CheckAreaObj skillId=%s, attakDis=%s not in matrixDict=%s" % (curSkill.GetSkillID(), attackDis, ChConfig.MatrixDict)) return resultList #¼¼Äܹ¥»÷×î´óÊýÁ¿ hurtCount = SkillCommon.GetSkillArea_Atk_Count(attacker, curSkill) ownerPlayerID = 0 isSummonNPCAtker = attacker.GetGameObjType() == IPY_GameWorld.gotNPC and NPCCommon.IsSummonNPC(attacker) if isSummonNPCAtker: ownerPlayer = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, attacker) if ownerPlayer: ownerPlayerID = ownerPlayer.GetPlayerID() # Ⱥ¹¥Ôö¼Ó¶ÔÏóÖ÷ÒªÊÇΪÁËÈÃÑ¡ÖÐÄ¿±ê¸üÈÝÒ×±»»÷ÖÐ attackAim = GetAreaAttackAim(attacker, curSkill, CheckFunc, tick) if attackAim: hurtCount -= 1 resultList.append(attackAim) if skillMatrix: # °´·¶Î§ËÑË÷ resultList = ServerByPos(attacker, curSkill, tick, skillMatrix, hurtCount, srcPosX, srcPosY, hurtTypeList, attackAim, curSkillUseTag, CheckFunc, ownerPlayerID, isSummonNPCAtker, resultList) elif attackDis == Def_SearchMap_Player: # ËÑË÷±¾µØÍ¼µ±Ç°ÏßÂ·Íæ¼Ò ServerByMapPlayer(attacker, curSkill, tick, hurtTypeList, attackAim, curSkillUseTag, CheckFunc, ownerPlayerID, isSummonNPCAtker, resultList, hurtCount) elif attackDis == Def_SearchMap_NPC: # ËÑË÷±¾µØÍ¼µ±Ç°Ïß·NPC ServerByMapNPC(attacker, curSkill, tick, hurtTypeList, attackAim, curSkillUseTag, CheckFunc, ownerPlayerID, isSummonNPCAtker, resultList, hurtCount) return resultList # °´·¶Î§ËÑË÷Ä¿±ê¶ÔÏó def ServerByPos(attacker, curSkill, tick, skillMatrix, hurtCount, srcPosX, srcPosY, hurtTypeList, attackAim, curSkillUseTag, CheckFunc, ownerPlayerID, isSummonNPCAtker, resultList): ownerTag = None gameMap = GameWorld.GetMap() for curPos in skillMatrix: #É˺¦´ÎÊýµ½ÁË if hurtCount <= 0: break #¼ì²éÓÐûÓжÔÏóÔÚÕâÒ»µãÉÏ mapObj = gameMap.GetPosObj(srcPosX + curPos[0], srcPosY + curPos[1]) if not mapObj: continue #TestQun(srcPosX + curPos[0],srcPosY + curPos[1]) #±éÀúµ±Ç°µã¶ÔÏó for i in range(0, mapObj.GetObjCount()): #É˺¦´ÎÊýµ½ÁË if hurtCount <= 0: break curObj = mapObj.GetObjByIndex(i) curTag, ownerTag = __SearchCheck(attacker, curSkill, tick, curObj, hurtTypeList, attackAim, curSkillUseTag, CheckFunc, ownerPlayerID, isSummonNPCAtker, resultList) if not curTag: if ownerTag: hurtCount -= 1 continue hurtCount -= 1 resultList.append(curTag) if ownerTag: resultList.append(ownerTag) return resultList def __SearchCheck(attacker, curSkill, tick, curObj, hurtTypeList, attackAim, curSkillUseTag, CheckFunc, ownerPlayerID, isSummonNPCAtker, resultList, curTag=None): curObjType = curObj.GetGameObjType() #²»ÔÚÓ°Ïì¶ÔÏóÁбíÖÐ if curObjType not in hurtTypeList: return None, None if not AttackCommon.CheckSightLevel(attacker, curObj): return None, None #¹¥»÷¶ÔÏó if not curTag: curTag = GameWorld.GetObj(curObj.GetID(), curObjType) if not curTag: return None, None if attackAim and attackAim.GetID() == curTag.GetID(): # ²»ÔÚ¹¥»÷Ö÷Ä¿±ê return None, None if curSkillUseTag == ChConfig.Def_UseSkillTag_CanAttackNPC: if NPCCommon.GetNpcObjOwnerIsPlayer(curTag): #npcÖ÷ÈËÊÇÍæ¼Ò²»Äܹ¥»÷ return None, None if CheckFunc != None: #¼ì²éÊÇ·ñÊÜÓ°Ïì if not CheckFunc(attacker, curTag, curSkill, tick): return None, None # Èç¹û¹¥»÷ÕßÊÇÕÙ»½ÊÞ ÇÒ ¹¥»÷µÄÊÇÖ÷ÈËÍæ¼Ò£¬Ôò°ÑÖ÷ÈË·ÅÔÚ×îºóÃæÒ»¸ö´¦ÀíÉ˺¦Ä¿±ê£¬·ÀÖ¹ÏÈ´¦ÀíºóÈç¹ûÖ÷ÈËËÀÍö½«µ¼ÖºóÐøµÄÂß¼­Òì³£ if ownerPlayerID > 0 and curObjType == IPY_GameWorld.gotPlayer and isSummonNPCAtker and ownerPlayerID == curObj.GetID(): ownerTag = curTag return None, ownerTag return curTag, None # ËÑË÷±¾µØÍ¼µ±Ç°Ïß·NPC def ServerByMapNPC(attacker, curSkill, tick, hurtTypeList, attackAim, curSkillUseTag, CheckFunc, ownerPlayerID, isSummonNPCAtker, resultList, hurtCount): gameNPCManager = GameWorld.GetNPCManager() for index in xrange(gameNPCManager.GetNPCCount()): curNPC = gameNPCManager.GetNPCByIndex(index) if curNPC == None or curNPC.GetID() == 0: continue curTag, ownerTag = __SearchCheck(attacker, curSkill, tick, curNPC, hurtTypeList, attackAim, curSkillUseTag, CheckFunc, ownerPlayerID, isSummonNPCAtker, resultList, curTag=curNPC) if not curTag: if ownerTag: hurtCount -= 1 continue hurtCount -= 1 resultList.append(curTag) if ownerTag: resultList.append(ownerTag) return resultList # ËÑË÷±¾µØÍ¼µ±Ç°ÏßÂ·Íæ¼Ò def ServerByMapPlayer(attacker, curSkill, tick, hurtTypeList, attackAim, curSkillUseTag, CheckFunc, ownerPlayerID, isSummonNPCAtker, resultList, hurtCount): copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() for i in range(copyMapPlayerManager.GetPlayerCount()): curPlayer = copyMapPlayerManager.GetPlayerByIndex(i) if curPlayer == None or curPlayer.IsEmpty(): continue curTag, ownerTag = __SearchCheck(attacker, curSkill, tick, curPlayer, hurtTypeList, attackAim, curSkillUseTag, CheckFunc, ownerPlayerID, isSummonNPCAtker, resultList, curTag=curPlayer) if not curTag: if ownerTag: hurtCount -= 1 continue hurtCount -= 1 resultList.append(curTag) if ownerTag: resultList.append(ownerTag) return resultList ## »ñµÃ¿É¹¥»÷¶ÔÏóÁÐ±í£¬¸ù¾ÝÊýÁ¿È¡ # @param attacker ¹¥»÷ÕßʵÀý # @param curSkill ¼¼ÄÜʵÀý # @param srcPosX ¹¥»÷Æðµã×ø±êX # @param srcPosX ¹¥»÷Æðµã×ø±êY # @param tick µ±Ç°Ê±¼ä # @param skillMatrix ¹¥»÷¾ØÕó # @return ¹¥»÷Áбí¶ÔÏó # @remarks º¯ÊýÏêϸ˵Ã÷.»ñµÃ¿É¹¥»÷¶ÔÏóÁÐ±í£¬¸ù¾ÝÊýÁ¿È¡ def __GetAreaAtackObj(attacker, curSkill, srcPosX, srcPosY, tick, CheckFunc=None, skillMatrix=None): if SkillShell.IsPlayerUseSkill(attacker, curSkill): return CheckAreaObjClient(attacker, curSkill, tick, CheckFunc) else: return CheckAreaObjServer(attacker, curSkill, srcPosX, srcPosY, tick, CheckFunc, skillMatrix) #------------------------------------------------------------------ ## warning: ¹¥»÷½áÊø¹«¹²Âß¼­, ´ËÂß¼­ÐèÖØÐ¿¼ÂÇ£¬´æÔÚÒþ²Øbug # @param attacker ¹¥»÷Õß # @param defender ·ÀÓùÕß # @param useSkill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def DoAttackResultCommon(attacker, defender, useSkill, tick): #¼¼Äܹ¥»÷¶ÔÏóËÀÍö´¥·¢¼¼ÄÜÅÐ¶Ï #SkillShell.DoLogic_SkillAttackDie(attacker, defender, useSkill, tick) #Íæ¼ÒËÀÍöÁ÷Ïò¼Ç¼ __DR_PlayerDead(attacker, defender) return ## Íæ¼ÒËÀÍöÁ÷Ïò¼Ç¼ # @param attacker: ¹¥»÷Õß # @param defender ·ÀÓùÕß # @return None def __DR_PlayerDead(attacker, defender): #Íæ¼ÒËÀÍöÁ÷Ïò¼Ç¼ if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull: #FBÖÐËÀÍö²»¼Ç¼ return defenderType = defender.GetGameObjType() if defenderType != IPY_GameWorld.gotPlayer: #·ÀÊØ·½²»ÊÇÍæ¼Ò return if GameObj.GetHP(defender) > 0: #»¹»î×Å return atkObjType = attacker.GetGameObjType() atkObjID = attacker.GetID() # ¹¥»÷·½ID mapID = GameWorld.GetMap().GetMapID() DataRecordPack.DR_PlayerDead(atkObjType, atkObjID, defender, mapID) return #------------------------------------------------------------------ ## ±»¹¥»÷½áÊø # @param defender ·ÀÓùÕß # @param curSkill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def DoBeAttackOver(attacker, defender, curSkill, tick): if defender == None: #GameWorld.Log("----------ȺÌå¹¥»÷´íÎó,ÎÞ¶ÔÏó") return #·ÀÊØÕßÀàÐÍ defenderType = defender.GetGameObjType() if defenderType == IPY_GameWorld.gotPlayer: __DoPlayerBeAttacked(attacker, defender, curSkill, tick) elif defenderType == IPY_GameWorld.gotNPC: __DoNPCBeAttacked(defender, curSkill, tick) else: GameWorld.Log("±»¹¥»÷´íÎó : %d " % defender.GetGameObjType()) FBLogic.DoBeAttackOver(attacker, defender, curSkill, tick) return #--------------------------------------------------------------------- ## ¹¥»÷³É¹¦ # @param attacker ¹¥»÷Obj # @param attackerHP ¹¥»÷·½¹¥»÷ǰѪÁ¿ # @param target ·ÀÊØObj # @param curSkill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @return True or False # @remarks º¯ÊýÏêϸ˵Ã÷. def __AttackSuccess(attacker, attackerHP, target, curSkill, tick): #¹¥»÷ÕßÀàÐÍ attackerType = attacker.GetGameObjType() if attackerType == IPY_GameWorld.gotPlayer: return __DoPlayerAttackSuccess(attacker, attackerHP, target, curSkill, tick) elif attackerType == IPY_GameWorld.gotNPC: return __DoNPCAttackSuccess(attacker, attackerHP, target, curSkill, tick) else: GameWorld.Log("¹¥»÷´íÎó : %d " % attacker.GetGameObjType()) return False ## Ö´Ðй¥»÷³É¹¦ # @param attacker ¹¥»÷Obj # @param attackerHP ¹¥»÷·½¹¥»÷ǰѪÁ¿ # @param target ·ÀÊØObj # @param curSkill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @param value Ìí¼ÓÖµ # @return True or False __AttackSuccessµÄ·µ»ØÖµ # @remarks º¯ÊýÏêϸ˵Ã÷. def DoAttackSuccess(attacker, attackerBeHP, target, curSkill, tick, value=0, hurtType=ChConfig.Def_HurtType_Normal): global g_skillHurtList g_skillHurtList.Clear() if target != None and value != 0: AttackCommon.AddHurt(target, g_skillHurtList, hurtType, value) return __AttackSuccess(attacker, attackerBeHP , target, curSkill, tick) # BUFFרÓà def DoAttackSuccessEx(attacker, attackerBeHP, target, curSkill, tick): # ½«É˺¦ÁбíÌáǰ´¦Àí£¬Õâ±ß»áÇå³ýÔì³ÉºóÐø±»¶¯¼¼ÄÜÎÞ·¨Õý³£Ê¹Óã¬ÈçXP´óÕкͽ£Èз籩Àà³ÖÐøÐÔ return __AttackSuccess(attacker, attackerBeHP , target, curSkill, tick) ## ´¦Àí´¥·¢¼¼Äܺ͹¥»÷³É¹¦Âß¼­ # @param attacker ¹¥»÷Obj # @param defender ·ÀÊØ·½ # @param curSkill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @param isEnhanceSkill ÊÇ·ñ¸½¼Ó¼¼ÄÜ # @return True or False # @remarks ´¦Àí´¥·¢¼¼Äܺ͹¥»÷³É¹¦Âß¼­ def DoSkillEx_AttackSucess(attacker, defender, curSkill, tick, isEnhanceSkill=False): if isEnhanceSkill: return True result = DoAttackSuccess(attacker, GameObj.GetHP(attacker), defender, curSkill, tick) #µ÷Óô¥·¢¸½¼Ó¼¼ÄÜ SkillShell.DoLogic_UseEnhanceSkill(attacker, defender, curSkill, tick) #·Ç¹¥»÷Ðͼ¼ÄÜ(Ò²²»ÊÇBuff)ÐèÒªµ÷ÓÃÊ©·¨³É¹¦ return result ## Ö´ÐÐȺ¹¥³É¹¦(²ÎÊý -> ¹¥»÷·½,¹¥»÷·½¹¥»÷ǰѪÁ¿,·ÀÊØ·½,¼¼ÄÜ,µ±Ç°Ê±¼ä) # @param attacker ¹¥»÷Obj # @param attackerHP ¹¥»÷·½¹¥»÷ǰѪÁ¿ # @param targetList ·ÀÊØObjList # @param valueList Ìí¼ÓÖµList # @param curSkill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @return True or False __AttackSuccessµÄ·µ»ØÖµ # @remarks º¯ÊýÏêϸ˵Ã÷. def DoAreaAttackSuccess(attacker, attackerBeHP, targetList, valueList, curSkill, tick, hurtType=ChConfig.Def_HurtType_Normal): global g_skillHurtList g_skillHurtList.Clear() target = None for index in range(len(targetList)): target = targetList[index] value = valueList[index] AttackCommon.AddHurt(target, g_skillHurtList, hurtType, value) return __AttackSuccess(attacker, attackerBeHP , target, curSkill, tick) ## ֪ͨ¿Í»§¶Ë¹¥»÷½á¹û # @param attacker ¹¥»÷Obj # @param defender ·ÀÊØObj # @param curSkill ¼¼ÄÜʵÀý # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __Sync_AttackResult(attacker, defender, curSkill): #ÆÕͨ¹¥»÷ if not curSkill: #GameWorld.Log("Íæ¼ÒÆÕͨ¹¥»÷³É¹¦") if g_skillHurtList.GetHurtCount() != 1: GameWorld.ErrLog(' __Sync_AttackResult attackErr, attackerName = %s, \ ID = %s, hurtCount = %s ' % (attacker.GetName(), attacker.GetID(), g_skillHurtList.GetHurtCount())) else: curHurt = g_skillHurtList.GetHurtAt(0) attacker.BaseAttack(curHurt.GetObjID(), curHurt.GetObjType(), AttackCommon.GetBattleType(attacker, curSkill), curHurt.GetAttackType(), curHurt.GetHurtHP(), curHurt.GetHurtHPEx(), curHurt.GetCurHP(), curHurt.GetCurHPEx()) #//·µ»ØÖµÎÞÒâÒå return #¼¼Äܹ¥»÷ skillID = curSkill.GetSkillID() changeSkillID = PassiveBuffEffMng.GetPassiveSkillValueByTriggerTypeEx(attacker, None, curSkill, ChConfig.TriggerType_ChangeSkillEff) if changeSkillID: skillID = changeSkillID battleType = AttackCommon.GetBattleType(attacker, curSkill) #ÎÞÄ¿±êÀ༼ÄÜ if not defender: #Íæ¼Ò´¦Àí if attacker.GetGameObjType() == IPY_GameWorld.gotPlayer: useSkillPosX = attacker.GetUseSkillPosX() useSkillPosY = attacker.GetUseSkillPosY() if useSkillPosX and useSkillPosY: #¶ÔµØÃæÀ༼ÄÜ -> ֪ͨ¿Í»§¶Ë if attacker.GetGameObjType() == IPY_GameWorld.gotPlayer: PYView_UseSkillPos(attacker, skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList, False) PYView_UseSkillPos_NotifySelf(attacker, skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList) else: if attacker.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosX): useSkillPosX = attacker.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosX) useSkillPosY = attacker.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosY) PYView_UseSkillPos(attacker, skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList, False) #//·µ»ØÖµÎÞÒâÒå return #NPCÎÞÄ¿±êµÄÉ˺¦¹ã²¥ #attacker.View_UseSkill(skillID) if attacker.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosX): # Î»ÒÆÀà useSkillPosX = attacker.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosX) useSkillPosY = attacker.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosY) elif attacker.GetDictByKey(ChConfig.Def_NPC_Dict_SkillWarnPosX % 0): # Ô¤¾¯Àà useSkillPosX = attacker.GetDictByKey(ChConfig.Def_NPC_Dict_SkillWarnPosX % 0) useSkillPosY = attacker.GetDictByKey(ChConfig.Def_NPC_Dict_SkillWarnPosY % 0) else: useSkillPosX = attacker.GetPosX() useSkillPosY = attacker.GetPosY() # NPCûÓÐC++View_UseSkillPos½Ó¿Ú PYView_UseSkillPos(attacker, skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList, False) #//·µ»ØÖµÎÞÒâÒå return # Ä¿±êÀ༼ÄÜÒ²¸Ä³É¶ÔµØ¼¼Äܰü, 2017-12-17 useSkillPosX, useSkillPosY = defender.GetPosX(), defender.GetPosY() if attacker.GetGameObjType() == IPY_GameWorld.gotPlayer: # ΪÁ˿ͻ§¶Ë±íÏÖÌØÊâ´¦Àí£¬³å·æÍ¨ÖªµØ°å×ø±ê¶ø²»Êǵз½×ø±ê if curSkill.GetAtkType() == 9: useSkillPosX, useSkillPosY = attacker.GetUseSkillPosX(), attacker.GetUseSkillPosY() PYView_UseSkillPos(attacker, skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList, False) PYView_UseSkillPos_NotifySelf(attacker, skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList) else: if attacker.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosX): useSkillPosX = attacker.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosX) useSkillPosY = attacker.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosY) # NPCûÓÐC++View_UseSkillPos½Ó¿Ú PYView_UseSkillPos(attacker, skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList, False) return # ֪ͨ¿Í»§¶Ë±íÏÖ·â°ü ÎÞÆäËû×÷Óà def Sync_AttackResult(attacker, curSkill): global g_skillHurtList g_skillHurtList.Clear() defender = None if SkillShell.GetSkillFireAim(curSkill) == ChConfig.Def_UseSkillAim_Obj: useSkillTagID = attacker.GetUseSkillTagID() useSkillTagType = attacker.GetUseSkillTagType() defender = GameWorld.GetObj(useSkillTagID, useSkillTagType) __Sync_AttackResult(attacker, defender, curSkill) ##############################Ö÷¶¯¹¥»÷³É¹¦############################# ## Íæ¼Ò¹¥»÷³É¹¦ # @param curPlayer ¹¥»÷Obj # @param curPlayerBeHP µ±Ç°Íæ¼Ò±»¹¥»÷ǰѪÁ¿ # @param target ·ÀÊØObj # @param curSkill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @return True # @remarks ÕâÀïÔÚ¹¥»÷½áÊøºó,Ö»»áµ÷ÓÃÒ»´Î,¶ø¹¥»÷·½·¨ÖÐAttackResult½«¶à´Î±»µ÷ÓÃ(Ⱥ¹¥) # ÕâÀïÖ»´¦Àí¹¥»÷·½Âß¼­,,ËùÓÐÄ¿±ê·½Âß¼­ÔÚAttackResultÖд¦Àí def __DoPlayerAttackSuccess(curPlayer, curPlayerBeHP, target, curSkill, tick): #-------------- #ÕâÀïÔÚ¹¥»÷½áÊøºó,Ö»»áµ÷ÓÃÒ»´Î,¶ø¹¥»÷·½·¨ÖÐAttackResult½«¶à´Î±»µ÷ÓÃ(Ⱥ¹¥) #ÕâÀïÖ»´¦Àí¹¥»÷·½Âß¼­,,ËùÓÐÄ¿±ê·½Âß¼­ÔÚAttackResultÖд¦Àí #-------------- #±»¶¯¼¼ÄÜ´¥·Å²»ÔÙ´¦Àí£¬±ÜÃâËÀÑ­»· if SkillCommon.GetUsingPassiveSkill(curPlayer): skillTypeID = curSkill.GetSkillTypeID() curPlayerSkill = curPlayer.GetSkillManager().FindSkillBySkillTypeID(skillTypeID) #֪ͨ¿Í»§¶Ë¹¥»÷½á¹û __Sync_AttackResult(curPlayer, target, curSkill) if curPlayerSkill: SkillCommon.SetSkillRemainTime(curPlayerSkill, PlayerControl.GetReduceSkillCDPer(curPlayer), tick, curPlayer) if curSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_GiftSkill, ChConfig.Def_SkillFuncType_FbSPSkill, ChConfig.Def_SkillFuncType_PassiveSkillWithSP]: UseSkillOver(curPlayer, target, curSkill, tick) else: OnHurtTypeTriggerPassiveSkill(curPlayer, target, curSkill, tick) return True AttackCommon.ClearFirstDefender(curPlayer) #Íæ¼Ò½øÈëÕ½¶·×´Ì¬ #¼¼ÄÜÊǹ⻷, ²»½øÈëÕ½¶·×´Ì¬ ,ÎÞ¶ÔÏó,²»½øÈëÕ½¶·×´Ì¬ if (curSkill == None \ or curSkill.GetSkillType() not in ChConfig.Def_NoBattleState_List): #and target != None: AttackCommon.SetPlayerBattleState(curPlayer, tick) #֪ͨ¿Í»§¶Ë¹¥»÷½á¹û __Sync_AttackResult(curPlayer, target, curSkill) #BaseAttack»áÉèÖù¥»÷¼ä¸ôÆðʼʱ¼ä£¬Ë²ÒÆÈ¡Ïû #=========================================================================== # if curSkill and curSkill.GetSkillTypeID() in ReadChConfig.GetEvalChConfig("SkillTypeIDNoInterval"): # #GameWorld.DebugLog("#Ë²ÒÆ¼¼Äܲ»Ó°Ïì¹¥»÷¼ä¸ô£¬Ö»Ó°Ï칫¹²CD") # curPlayer.SetAttackTick(0) #=========================================================================== #Èç¹ûÊǼ¼Äܹ¥»÷ if curSkill: skillTypeID = curSkill.GetSkillTypeID() #¿ÛÊôÐÔ,Èçħ·¨,XPµã SetSkillLostAttr(curPlayer, curSkill, tick) #¿Û²ÄÁÏ SetSkillLostItem(curPlayer, curSkill) #¼¼ÄÜʹÓóɹ¦ curPlayerSkill = curPlayer.GetSkillManager().FindSkillBySkillTypeID(skillTypeID) if curPlayerSkill: if not IsSkipSkillCD(curPlayer, target, curSkill, tick): #ÉèÖÃÍæ¼ÒËùѧ¼¼ÄÜÀäÈ´CD SkillCommon.SetSkillRemainTime(curPlayerSkill, PlayerControl.GetReduceSkillCDPer(curPlayer), tick, curPlayer) #µ÷ÓÃÈÎÎñ´¥·¢Æ÷ #EventShell.EventRespons_UseSkillOK(curPlayer, skillTypeID) #Ö´ÐÐÁ¬»·±»¶¯¼¼ÄÜ´¦Àí #__DealWithPassivitySkill( curPlayer, target, curPlayerSkill, tick ) #Ö´Ðб»¶¯buff #__DealWithPassivityBuff( curPlayer, tick ) #¹¥»÷½áÊøºó£¬¸±±¾´¥·¢ FBLogic.DoFBAttackedOver(curPlayer, target, curSkill, tick) # ÆÕ¹¥ºÍ¶ÔµÐ¼¼ÄÜ UseSkillOver(curPlayer, target, curSkill, tick) return True # ÎÞÀäȴ״̬ def IsSkipSkillCD(curPlayer, target, curSkill, tick): # ±©»÷Çé¿öÏ isSuperHit = False for i in xrange(g_skillHurtList.GetHurtCount()): hurtObj = g_skillHurtList.GetHurtAt(i) if not hurtObj: continue if hurtObj.GetAttackType() == ChConfig.Def_HurtType_SuperHit: isSuperHit = True break if isSuperHit: if PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(curPlayer, None, curSkill, ChConfig.TriggerType_SuperHitSkipCD): return True if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(curPlayer, None, curSkill, ChConfig.TriggerType_SuperHitSkipCD): return True return False ### ²»¹Üʲô¼¼Äܶ¼»áµ½´Ë´¦ #Ö»¶ÔµÚһĿ±êÔì³ÉijÉ˺¦ÀàÐÍʱ´¥·¢¼¼ÄÜ def OnHurtTypeTriggerSkillFirstObj(attacker, curSkill, tick): if g_skillHurtList.GetHurtCount() == 0: return hurtObj = g_skillHurtList.GetHurtAt(0) if not hurtObj: return objID, objType, hurtType = hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType() defender = GameWorld.GetObj(objID, objType) if not defender: return if hurtType == ChConfig.Def_HurtType_SuperHit: PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SuperHit, tick) PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SuperHit, tick) elif hurtType == ChConfig.Def_HurtType_ThumpHit: PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_ThumpHit, tick) return # ¸ù¾ÝÉËѪÀàÐÍ´¥·¢¼¼ÄÜ£¬Èº¹¥Ö»´¥·¢Ò»´Î£¬·ÅÔÚÉËѪÁÐ±í±»Çå֮ǰ def OnHurtTypeTriggerSkill(attacker, target, curSkill, tick): usePassiveSkillResult = True # µÚÒ»´ÎÅжϲ»Äܵ÷Ó㬼´´ú±í¶¼²»¿ÉÓÃÎÞÐèÑ­»· usePassiveSkillResultOnSuperHit = True # ±©»÷¶ÔÏó1V1´¥·¢£¬µÚÒ»´ÎÅжϲ»Äܵ÷Ó㬼´´ú±í¶¼²»¿ÉÓÃÎÞÐèÑ­»· skillHurtLists = [] # ÄÚ²¿´¥·¢Çå³ýg_skillHurtList for i in xrange(g_skillHurtList.GetHurtCount()): hurtObj = g_skillHurtList.GetHurtAt(i) if not hurtObj: continue skillHurtLists.append([hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType()]) #ÃüÖиöÊý¼ÇÂ¼ÌØÊâ´¦Àí PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(attacker, target, curSkill, ChConfig.TriggerType_HitValue) # #³ÖÐø¹¥»÷ÀàBUFF ÀལÈз籩ÊÇÏȸø×ÔÉíÒ»¸ö³ÖÐøÐÔbuff£¬ÕâÒ»´Î²»ËãÉ˺¦²»¿É´¥·¢ if curSkill and ChConfig.Def_SkillType_LstPlsBuffAtk != curSkill.GetSkillType(): #Ö»¶ÔµÚһĿ±êÔì³ÉijÉ˺¦ÀàÐÍʱ´¥·¢¼¼ÄÜ£¬ ÐèÏÈ´æ´¢ skillHurtLists OnHurtTypeTriggerSkillFirstObj(attacker, curSkill, tick) skillIDSet = set() for hurtList in skillHurtLists: objID, objType, hurtType = hurtList defender = GameWorld.GetObj(objID, objType) if not defender: continue if GameObj.GetHP(defender) <= 0: if objType == IPY_GameWorld.gotPlayer: if hurtType == ChConfig.Def_HurtType_Zhansha: defender.SetDict(ChConfig.Def_PlayerKey_Zhansha, 1) elif hurtType == ChConfig.Def_HurtType_ZhognjiZhansha: defender.SetDict(ChConfig.Def_PlayerKey_Zhansha, 2) # ±ôËÀ״̬´¥·¢¼¼ÄÜ, ²»ÄÜÔÚGetHurtHPÄÚ²¿´¥·¢¼¼ÄÜ£¬·ñÔò»áµ¼ÖÂÔ­¼¼ÄܵÄÉËѪÁбíÒì³£ PassiveBuffEffMng.OnPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_WillDead, tick) PassiveBuffEffMng.OnPassiveBuffTrigger(defender, attacker, None, ChConfig.TriggerType_WillDead, tick) if hurtType in [ChConfig.Def_HurtType_Zhansha, ChConfig.Def_HurtType_ZhognjiZhansha]: defender.SetDict(ChConfig.Def_PlayerKey_Zhansha, 0) continue if usePassiveSkillResult: usePassiveSkillResult = PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_HurtObjAddBuff, tick, skillIDSet=skillIDSet) if usePassiveSkillResultOnSuperHit and hurtType == ChConfig.Def_HurtType_SuperHit: # ±©»÷¶ÔÄ¿±êÒ»Ò»´¥·¢±»¶¯ usePassiveSkillResultOnSuperHit = PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SuperHitOneByOne, tick, skillIDSet=skillIDSet) if hurtType == ChConfig.Def_HurtType_SuperHit: #±»±©»÷´¥·¢¼¼ÄÜ PassiveBuffEffMng.OnPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_BeSuperHit, tick) PassiveBuffEffMng.OnPetPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_BeSuperHit, tick) elif hurtType == ChConfig.Def_HurtType_Miss: PassiveBuffEffMng.OnPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_MissSkill, tick) elif hurtType == ChConfig.Def_HurtType_LuckyHit: PassiveBuffEffMng.OnPetPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_BeLuckyHit, tick) if hurtType in ChConfig.Def_RealAttack_Type: # ±»¹¥»÷´¦Àí²ã¼¶ PassiveBuffEffMng.OnPassiveBuffTrigger(defender, attacker, None, ChConfig.TriggerType_Buff_BeAttackSubLayer, tick) # Ò»Ò»´¥·¢¼¼ÄÜÐèÒªÔÚ×îºóÉèÖÃCD for skillTypeID in skillIDSet: passiveSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID) if not passiveSkill: continue SkillCommon.SetSkillRemainTime(passiveSkill, 0, tick, attacker) # ÁéÎªÍæ¼ÒµÄÌæÉíÐèÒª×ß´ËÂß¼­ # ¼¼ÄÜʹÓýáÊø£¬ÔÚ´¦Àí¼¼ÄÜÂß¼­ºÍ֪ͨ·â°üÖ®ºóµ÷Óà def UseSkillOver(attacker, defender, curSkill, tick): # ¸ù¾ÝÉËѪÀàÐÍ´¥·¢¼¼ÄÜ£¬Èº¹¥Ö»´¥·¢Ò»´Î£¬·ÅÔÚÉËѪÁÐ±í±»Çå֮ǰ OnHurtTypeTriggerSkill(attacker, defender, curSkill, tick) # ÆÕͨ»òÕß¿ÉÒÔÖ÷¶¯ÊͷŵĹ¥»÷ÐÔ¼¼ÄÜ if not curSkill or (curSkill.GetSkillType() == ChConfig.Def_SkillType_Atk and\ curSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_FbSkill, ChConfig.Def_SkillFuncType_PetSkill, ChConfig.Def_SkillFuncType_NormalAttack]): # ¹¥»÷¼õ²ã¼¶ ÓÅÏÈ´¦Àí£¬ÒòΪͬ¸ö¼¼ÄÜ´¥·¢buffºó£¬»áÔÙ´¦Àí²ã¼¶£¬µ¼ÖÂÁ¢¼´¼õ²ã¼¶ PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_Buff_AttackSubLayer, tick) # ÆÕ¹¥ºÍ¶ÔµÐ¼¼ÄÜ, ´Ë´¦ÔÝÇÒÌØÊâ´¦ÀíDef_SkillFuncType_PassiveSkillWithSP£¬´ýÓÅ»¯ if not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PassiveSkillWithSP: PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOver, tick) PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOver, tick) # TriggerType_AttackOver ºÍ TriggerType_AttackOverPassive ¸ù¾Ý´¥·¢µÄ±»¶¯buffЧ¹û˳Ðò¶ø¶¨ PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_AttackOverPassive, tick) AttackFaintRate(attacker, defender, curSkill, tick) else: PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SkillOverNoAttack, tick) #Êͷż¼Äܼ´¿É´¦ÀíµÄ ²»Çø·Ö¹¥»÷ºÍ·Ç¹¥»÷ PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SkillSuccess, tick) PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SkillSuccessExpend, tick) return # ÊôÐÔ»÷ÔÎ def AttackFaintRate(attacker, defender, curSkill, tick): if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer: return faintRate = PlayerControl.GetFaintRate(attacker) if not faintRate: #GameWorld.DebugLog("ûÓл÷ÔθÅÂÊ!", attacker.GetID()) return if curSkill: useSkillData = attacker.GetUseSkill() # ·ÇÖ÷¶¯ÐÔ¼¼Äܲ»´¥·¢ if not useSkillData: return if useSkillData.GetSkillID() != curSkill.GetSkillID(): return if not defender: useSkillTagID = attacker.GetUseSkillTagID() useSkillTagType = attacker.GetUseSkillTagType() defender = GameWorld.GetObj(useSkillTagID, useSkillTagType) if not defender: return if attacker.GetID() == defender.GetID(): return if GameObj.GetHP(defender) <= 0: return tagFaintRate = PlayerControl.GetFaintDefRate(defender) if defender.GetGameObjType() == IPY_GameWorld.gotPlayer else 0 # Ìí¼Ó×î¸ß60%»÷ÔÎЧ¹û maxRate = IpyGameDataPY.GetFuncCfg("PassiveSkillFaint", 1) rate = min(max(faintRate - tagFaintRate, 0), maxRate) if not GameWorld.CanHappen(rate): return faintCD = IpyGameDataPY.GetFuncCfg("PassiveSkillFaint", 2) * 1000 if faintCD: lastTick = attacker.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintCD) remainTick = faintCD - (tick - lastTick) if remainTick > 0: GameWorld.DebugLog("»÷ÔÎCDÖÐ! rate=%s,Ê£Óàtick=%s" % (rate, remainTick), attacker.GetID()) return attacker.SetDict(ChConfig.Def_PlayerKey_AttrFaintCD, tick) GameWorld.DebugLog("´¥·¢»÷ÔÎ! rate=%s" % rate, attacker.GetID()) SkillCommon.AddBuffBySkillType(defender, ChConfig.Def_SkillID_AtkerFaint, tick) return #--------------------------------------------------------------------- ## ÉèÖü¼ÄÜÏûºÄÎïÆ· # @param curPlayer ʹÓü¼ÄÜÕß # @param curSkill ¼¼ÄÜʵÀý # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def SetSkillLostItem(curPlayer, curSkill): useItemID = curSkill.GetUseItemID() useItemCount = curSkill.GetUseItemCount() if not useItemID or not useItemCount: return item = ItemCommon.FindItemInPackByItemID(curPlayer, useItemID, IPY_GameWorld.rptItem) if not item: GameWorld.ErrLog('###Êͷż¼ÄÜ = %s¿Û³ý²ÄÁÏ = %sÒì³£' % ( curSkill.GetSkillTypeID(), useItemID), curPlayer.GetID()) return #PlayerControl.NotifyCode(curPlayer, "LostRes", [useItemID, useItemCount]) itemCount = item.GetCount() DataRecordPack.DR_UseSkilLostItem(curPlayer, useItemID, useItemCount, item.GetGUID(), curSkill.GetSkillTypeID()) if itemCount < useItemCount: GameWorld.ErrLog('###Êͷż¼ÄÜ = %s¿Û³ý²ÄÁÏ = %sÒì³£, ÊýÁ¿²»×ã' % ( curSkill.GetSkillTypeID(), useItemID), curPlayer.GetID()) item.Clear() return ItemControler.SetItemCount(item, itemCount - useItemCount, curPlayer.GetID(), curPlayer.GetAccID(), curPlayer.GetPlayerName()) return #--------------------------------------------------------------------- ## Ö´Ðй¥»÷³É¹¦ºóµÄ±»¶¯buffЧ¹û # @param curPlayer ʹÓü¼ÄÜÕß # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __DealWithPassivityBuff(curPlayer, tick): return ## ÉèÖÃÍæ¼ÒÊôÐÔÏûºÄ,Èçħ·¨,XPµã£¬HP # @param curPlayer ʹÓü¼ÄÜÕß # @param curSkill ʹÓü¼ÄÜ # @param tick µ±Ç°Ê±¼ä # @return None # @remarks ÉèÖÃÍæ¼ÒÊôÐÔÏûºÄ,Èçħ·¨,XPµã£¬HP def SetSkillLostAttr(curPlayer, curSkill, tick): #=========================================================================== # #-----------¿Ûħ·¨ # lostMPValue = curSkill.GetMP() # curPlayerMP = curPlayer.GetMP() # # if curPlayerMP < lostMPValue: # GameWorld.ErrLog('Êͷż¼ÄÜ = %sÒì³£, ħ·¨ = %s²»×ã = %s' % ( # curSkill.GetSkillTypeID(), curPlayerMP, lostMPValue)) # # if lostMPValue > 0: # curPlayer.SetMP(curPlayer.GetMP() - lostMPValue) # #×Ô¶¯»ØÄ§ # PlayerControl.PlayerAutoRestoreMP(curPlayer, tick) # # #----------¿ÛXPµã # lostXPValue = curSkill.GetXP() # curPlayerXP = curPlayer.GetXP() # # if curPlayerXP < lostXPValue: # GameWorld.ErrLog('Êͷż¼ÄÜ = %sÒì³£, XPµã = %s²»×ã = %s' % ( # curSkill.GetSkillTypeID(), curPlayerXP, lostXPValue)) # # if lostXPValue > 0: # remain = curPlayer.GetXP() - lostXPValue # remain = max(0, remain) # curPlayer.SetDict(ChConfig.Def_PlayerKey_RecordXPValue, remain) # curPlayer.SetXP(remain) #=========================================================================== #----------¿ÛHPµã lostHPValue = curSkill.GetHP() curPlayerHP = GameObj.GetHP(curPlayer) if curPlayerHP < lostHPValue: GameWorld.ErrLog('Êͷż¼ÄÜ = %sÒì³£, HPµã = %s²»×ã = %s' % ( curSkill.GetSkillTypeID(), curPlayerHP, lostHPValue)) if lostHPValue > 0: GameObj.SetHP(curPlayer, GameObj.GetHP(curPlayer) - lostHPValue) return ## Ö´Ðб»¶¯¼¼ÄÜ´¦Àí # @param curPlayer ʹÓü¼ÄÜÕß # @param target ·ÀÓùÕß # @param curPlayerSkill ʹÓü¼ÄÜ # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __DealWithPassivitySkill(curPlayer, target, curPlayerSkill, tick): #=============================================================================== # isSuperHit = GetIsSuperHit() # isMiss = GetIsMiss() # lostHP = GetLostHP() # skillManager = curPlayer.GetSkillManager() # #È«¾Ö±»¶¯¼¼ÄÜÊÇ·ñ¿ÉÒÔ´¥·¢ # #×¢:Ìí¼ÓÕâ¸öÅж¨,ÐèҪͬʱÐÞ¸ÄChConfig.Def_SkillID_TrigÅä¶ÔʹÓà # canDealWithTrigSkill = ( (tick - skillManager.GetTrigBuffSkillTick()) \ # > ChConfig.Def_Skill_PassivityTick ) # curPlayerJob = curPlayer.GetJob() # skillTypeID = curPlayerSkill.GetSkillTypeID() #=============================================================================== return #------------------------------------------------------------------ ## NPC¹¥»÷³É¹¦(²ÎÊý -> µ±Ç°NPC,µ±Ç°NPC±»»÷ǰѪÁ¿,¹¥»÷¶ÔÏó,¼¼ÄÜ,µ±Ç°Ê±¼ä) # @param curNPC µ±Ç°NPC # @param curNPCBeHP µ±Ç°NPC±»»÷ǰѪÁ¿ # @param target ¹¥»÷¶ÔÏó # @param curSkill ¼¼ÄÜ # @param tick µ±Ç°Ê±¼ä # @return True # @remarks º¯ÊýÏêϸ˵Ã÷. def __DoNPCAttackSuccess(curNPC, curNPCBeHP, target, curSkill, tick): #-------------- #ÕâÀïÔÚ¹¥»÷½áÊøºó,Ö»»áµ÷ÓÃÒ»´Î,¶ø¹¥»÷·½·¨ÖÐAttackResult½«¶à´Î±»µ÷ÓÃ(Ⱥ¹¥) #ÕâÀïÖ»´¦Àí¹¥»÷·½Âß¼­,,ËùÓÐÄ¿±ê·½Âß¼­ÔÚAttackResultÖд¦Àí #-------------- #ÉèÖù¥»÷¼ä¸ô curNPC.SetAttackTick(tick) #֪ͨÉËѪ·´µ¯ #hurtHPValueSelf = curNPCBeHP - GameObj.GetHP(curNPC) #֪ͨ¿Í»§¶Ë¹¥»÷½á¹û __Sync_AttackResult(curNPC, target, curSkill) #¼¼ÄÜʹÓóɹ¦ if curSkill: skillTypeID = curSkill.GetSkillTypeID() #¼¼ÄÜʹÓóɹ¦ curNPCSkill = curNPC.GetSkillManager().FindSkillBySkillTypeID(skillTypeID) if not curNPCSkill: pass #GameWorld.ErrLog('NPC = %s, useSkillErr skillTypeID = %s' % (curNPC.GetNPCID(), skillTypeID)) else: #ÉèÖü¼Äܹ«¹²CD curNPC.SetUseSkillTick(tick) #ÉèÖõ¥¸ö¼¼ÄÜÀäȱCD SkillCommon.SetSkillRemainTime(curNPCSkill, 0, tick, curNPC) #__DealWithNPCPassSkill(curNPC,curSkill) #Ôö¼ÓNPC¼¼ÄÜʹÓôÎÊý useCnt = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_SkillUseCnt % skillTypeID) curNPC.SetDict(ChConfig.Def_NPC_Dict_SkillUseCnt % skillTypeID, min(useCnt + 1, ChConfig.Def_UpperLimit_DWord)) #=============================================================================== # #¼¼ÄÜÀàÐÍ :¹â»·¡¡²»ÈÃÖ÷È˽øÈëÕ½¶·×´Ì¬ # if curNPC.GetGameNPCObjType() == IPY_GameWorld.gnotSummon : # #»ñÈ¡µÄÖ÷ÈË # curPlayer = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer,curNPC) # #Èç¹ûÖ÷ÈËÊÇÍæ¼Ò # if curPlayer != None and GameObj.GetHP(curPlayer) > 0: # if curSkill == None or curSkill.GetSkillType() != ChConfig.Def_SkillType_Aura: # #½øÈëÕ½¶·×´Ì¬ # AttackCommon.SetPlayerBattleState(curPlayer,tick) #=============================================================================== #³èÎïÕÒµ½Ö÷È˽øÈëÕ½¶·×´Ì¬£¬¹â»·¼¼Äܲ»½øÈë if curNPC.GetGameNPCObjType() == IPY_GameWorld.gnotPet: curPlayer = PetControl.GetPetOwner(curNPC) if curPlayer != None and GameObj.GetHP(curPlayer) > 0: if curSkill == None or curSkill.GetSkillType() not in ChConfig.Def_NoBattleState_List: AttackCommon.SetPlayerBattleState(curPlayer, tick) FBLogic.DoOverNPCAttackSuccess(curNPC, target, tick) # ÁéÎªÍæ¼ÒµÄÌæÉíÐèÒª×ß´ËÂß¼­ UseSkillOver(curNPC, target, curSkill, tick) return True ## ´¦ÀíNPC¸½¼Ó±»¶¯¼¼ÄÜ # @param curNPC µ±Ç°NPC # @param curSkill ʹÓü¼ÄÜ # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __DealWithNPCPassSkill(curNPC, curSkill): return ##############################±»¹¥»÷³É¹¦############################# ## Íæ¼Ò±»¹¥»÷(µ±Ç°Íæ¼Ò,¼¼ÄÜ,µ±Ç°Ê±¼ä) # @param curNPC µ±Ç°NPC # @param curSkill ʹÓü¼ÄÜ # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __DoPlayerBeAttacked(attacker, curPlayer, curSkill, tick): #Íæ¼ÒÒѾ­ËÀÍö if GameObj.GetHP(curPlayer) <= 0: return #Æï³Ë״̬±»¹¥»÷£¬Ôò×Ô¶¯ÏÂÂí #=========================================================================== # if attacker and attacker.GetGameObjType() == IPY_GameWorld.gotPlayer: # if curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvHorse: # PlayerHorse.PlayerRideHorseDown(curPlayer) #=========================================================================== #BeHitWarn ×¢Ò⣺ÄúÕýÔÚÔâÊܹ¥»÷ #PlayerControl.NotifyCode(curPlayer, "BeHitWarn") #²É¼¯ÖÐ¶Ï PlayerControl.BreakPlayerCollect(curPlayer) #´ò×øÖÐ¶Ï #PlayerControl.DoPlayerStand(curPlayer) #¼¤»îÍæ¼Ò PlayerControl.SetIsNeedProcess(curPlayer, True) # ÔÝÇÒÖ»ÓÐÍæ¼Ò±»¹¥»÷´¥·¢ if not curSkill or curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List: # ÓÅÏÈ´¥·¢£¬ÈçÎ޵пÉÒÔµÖµ²ºóÐøµÄ±»¶¯É˺¦¼¼ÄÜ PassiveBuffEffMng.DelayUsePassiveTriggerSkill(curPlayer, curSkill, attacker, tick) PassiveBuffEffMng.OnPassiveSkillTrigger(curPlayer, attacker, None, ChConfig.TriggerType_BeAttackOver, tick) PassiveBuffEffMng.OnPassiveBuffTrigger(curPlayer, attacker, None, ChConfig.TriggerType_BeAttackOver, tick) # ÓÉÖ÷ÈËÌõ¼þ´¥·¢³èÎï±»¶¯¼¼ÄÜ PassiveBuffEffMng.OnPetPassiveSkillTrigger(curPlayer, attacker, None, ChConfig.TriggerType_BeAttackOver, tick) return ## NPC±»¹¥»÷(µ±Ç°NPC,¼¼ÄÜ,µ±Ç°Ê±¼ä) # @param curNPC µ±Ç°NPC # @param curSkill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __DoNPCBeAttacked(curNPC, curSkill, tick): #NPCÒѾ­ËÀÍö if GameObj.GetHP(curNPC) <= 0: return #ÅųýïÚ³µ if curNPC.GetGameNPCObjType() == IPY_GameWorld.gnotTruck: return #Åųý¹ if curNPC.GetType() == IPY_GameWorld.ntDeer: return #ÉèÖýøÈëÕ½¶·×´Ì¬ NPCCommon.SetNPCInBattleState(curNPC) # ±»»÷Ìí¼Ó²»ÈÃÖ÷¶¯Òƶ¯£¬Ó¦ÓÃAI1 if curNPC.GetIsBoss() == 0: curNPC.SetDict("NPCBeAttackedAI1", tick) return # ¿Í»§¶ËËÑË÷¶ÔÏóµÄÁ´Ê½¹¥»÷ def ChainAttackAreaEx(attacker, defender, curSkill, srcPosX, srcPosY, skillValue, skillPerList, tick, powerList = [], isExSkill = False): #Çå¿ÕÉËѪÁбí global g_skillHurtList g_skillHurtList.Clear() #¹¥»÷·½Ô­ÓÐѪÁ¿,ÓÃÀ´Í¨Öª·´µ¯ attackerHP = GameObj.GetHP(attacker) attackObjName = GetObjAttackName(attacker) resultList = list() #¹¥»÷½á¹ûÁбí #ÎÞ·¨ÕÒµ½ÏÂÒ»¸ö¶ÔÏóÔòÍ˳ö¹¥»÷ resultList = __DoNextDefenderEx(attacker, curSkill, skillValue, skillPerList, attackObjName, resultList, tick) #Ö´ÐÐȺ¹¥½á¹û __DoAreaAttackResult(attacker, defender, curSkill, resultList, attackerHP, tick, isExSkill) return True # Á´Ê½¹¥»÷ÖðÒ»¶ÔÓ¦É˺¦ def __DoNextDefenderEx(attacker, curSkill, skillValue, skillPerList, attackObjName, resultList, tick): curSkillUseTag = SkillShell.GetSkillAffectTag(curSkill) hurtTypeList = ChConfig.Def_Dict_UseSkillTag_ObjType.get(curSkillUseTag) #ÕÒ²»µ½¹¥»÷¶ÔÏóÀàÐÍÔòÍ˳ö if hurtTypeList == None: GameWorld.ErrLog("Def_Dict_UseSkillTag_ObjType ûÓжÔÓ¦Ïî %s" % curSkillUseTag) return resultList hurtDict = SkillShell.GetClientHurtDict() for i in range(len(skillPerList)): objID, curObjType = hurtDict.keys()[i] #²»Ôڿɹ¥»÷¶ÔÏóÁбíÖÐ if curObjType not in hurtTypeList: continue #¹¥»÷¶ÔÏó curTag = GameWorld.GetObj(objID, curObjType) if not curTag: continue #Á´Ê½¹¥»÷²»ÄܶÔïÚ³µÊÍ·Å if curObjType == IPY_GameWorld.gotNPC and curTag.GetGameNPCObjType() == IPY_GameWorld.gnotTruck: continue #¾ßÌåÅж¨¶ÔÏóÊÇ·ñ¿É¹¥»÷ if not __DoAttack(attacker, curTag, curSkill, attackObjName, skillValue, skillPerList[i], g_skillHurtList, tick): continue resultList.append(curTag) return resultList #------------------------------------------------------------------ ## ÇøÓòÌØÊâ¹¥»÷ͨÓú¯Êý,ÓÃÓÚ¸ü¸ÄÆðµã,Óй¥»÷´ÎÊý,¹¥»÷Ë¥¼õµÈ(ÈçÂÒ½£á÷»ê) # @param attacker ¹¥»÷ÕßʵÀý # @param defender ·ÀÓùÕßʵÀý # @param curSkill ¼¼ÄÜʵÀý # @param srcPosX ¹¥»÷Æðµã×ø±êX # @param srcPosX ¹¥»÷Æðµã×ø±êY # @param skillValue ¼¼ÄÜÔöǿֵ # @param skillPerList ¼¼ÄÜÔöÇ¿°Ù·Ö±ÈÁбí # @param tick µ±Ç°Ê±¼ä # @param powerList Ë¥¼õ»òÔöÇ¿Áбí[ [skillPercent,skillEnhance],...... ] # @param isExSkill ÊÇ·ñÊǸ½¼Ó¼¼ÄÜ, ¸½¼Ó¼¼Äܲ»Í¨Öª¹¥»÷³É¹¦, Ò²²»Ôٴδ¥·¢ÆäËû¸½¼Ó¼¼ÄÜ # @return Õæ/¼Ù ÊÇ·ñ¹¥»÷³É¹¦ # @remarks ÇøÓòÌØÊâ¹¥»÷ͨÓú¯Êý,ÓÃÓÚ¸ü¸ÄÆðµã,Óй¥»÷´ÎÊý,¹¥»÷Ë¥¼õµÈ(ÈçÂÒ½£á÷»ê) def ChainAttackArea(attacker, defender, curSkill, srcPosX, srcPosY, skillValue, skillPerList, tick, powerList = [], isExSkill = False): #×÷Ó÷¶Î§ ×÷ÓþØÕó attackDis = curSkill.GetAtkRadius() skillMatrix = ChConfig.MatrixDict.get(attackDis) if skillMatrix == None: GameWorld.ErrLog("ChainAttackArea skillId=%s, attakDis=%s not in matrixDict=%s" % (curSkill.GetSkillID(), attackDis, ChConfig.MatrixDict)) return False #Çå¿ÕÉËѪÁбí global g_skillHurtList g_skillHurtList.Clear() #ÏÈ»ñµÃ¹¥»÷µÄ´ÎÊý attackTimeSum = len(skillPerList) #¹¥»÷·½Ô­ÓÐѪÁ¿,ÓÃÀ´Í¨Öª·´µ¯ attackerHP = GameObj.GetHP(attacker) attackObjName = GetObjAttackName(attacker) #µÚÒ»´Î¹¥»÷Ñ¡ÖÐÄ¿±ê if not __DoAttack(attacker, defender, curSkill, attackObjName, skillValue, skillPerList[0], g_skillHurtList, tick): return False #GameWorld.Log("¹¥»÷Ä¿±ê: curTagID = %s,curTagName = %s "%( # defender.GetID(),defender.GetName())) gameMap = GameWorld.GetMap() resultList = list() #¹¥»÷½á¹ûÁбí resultList.append(defender) srcPos = [srcPosX, srcPosY] #---Á´Ê½¹¥»÷ÏÂÒ»¸öÄ¿±ê--- for index in range(1, attackTimeSum): #ÎÞ·¨ÕÒµ½ÏÂÒ»¸ö¶ÔÏóÔòÍ˳ö¹¥»÷ if not __DoNextDefender(attacker, curSkill, skillValue, skillPerList, attackObjName, srcPos, index, resultList, skillMatrix, gameMap, tick): #GameWorld.Log("3ÎÞ·¨ÕÒµ½ÏÂÒ»¸ö¶ÔÏóÔòÍ˳ö¹¥»÷") break #Ö´ÐÐȺ¹¥½á¹û __DoAreaAttackResult(attacker, defender, curSkill, resultList, attackerHP, tick, isExSkill) return True ## Á´Ê½¹¥»÷Ö´Ðе¥´ÎDoAttackÂß¼­ # @param attacker ¹¥»÷ÕßʵÀý # @param defender ·ÀÓùÕßʵÀý # @param curSkill ¼¼ÄÜʵÀý # @param attackObjName ¹¥»÷ÕßÀàÐÍÖ¸¶¨Ãû³Æ # @param skillValue ¼¼ÄÜÔöǿֵ # @param skillPer ¼¼ÄÜÔöÇ¿°Ù·Ö±È # @param tick µ±Ç°Ê±¼ä # @return Õæ/¼Ù ÊÇ·ñ¹¥»÷³É¹¦ # @remarks Á´Ê½¹¥»÷Ö´Ðе¥´ÎDoAttackÂß¼­ def __DoAttack(attacker, defender, curSkill, attackObjName, skillValue, skillPer, g_skillHurtList, tick): #²»¿É¹¥»÷Ñ¡ÖÐÄ¿±ê if not __CheckCanAttack(attacker, defender, curSkill, tick): return callName = "%s_Attack_%s.%s" % (attackObjName, GetObjAttackName(defender), "DoAttack") callFunc = GameWorld.GetExecFunc(AttackLogic, callName) if not callFunc: return #¹¥»÷ǰÁ¬»÷¼ì²é SkillCommon.UpdateSkillCombo(attacker, curSkill, tick) #GameWorld.Log("1skillPer: %s"%skillPer) callFunc(attacker, defender, curSkill, skillValue, skillPer, g_skillHurtList, tick) return True ## ÅжÏÔÚÁ´Ê½¹¥»÷ÖÐÊÇ·ñ±»¹¥»÷¹ý # @param curTag ±»¹¥»÷Ä¿±ê # @param resultList Òѱ»¹¥»÷Áбí # @return Õæ/¼Ù ÊÇ·ñÒѱ»¹¥»÷ # @remarks ÅжÏÔÚÁ´Ê½¹¥»÷ÖÐÊÇ·ñ±»¹¥»÷¹ý def __IsAlreadyAttack(curTag, resultList): #¶ÔÏó²»´æÔÚ if curTag == None: return True #¸ÃλÖÃÒÑÓÐNPC±»´Ë´ÎÁ´Ê½¹¥»÷ for tag in resultList: if not tag: continue if GameWorld.IsSameObj(curTag, tag): return True return False ## ¹¥»÷ÏÂÒ»¸öÁ´Ê½Ä¿±ê(ÈçÂÒ½£á÷»ê) # @param attacker ¹¥»÷ÕßʵÀý # @param curSkill ¼¼ÄÜʵÀý # @param skillValue ¼¼ÄÜÔöǿֵ # @param skillPerList ¼¼ÄÜÔöÇ¿°Ù·Ö±ÈÁбí # @param attackObjName ¹¥»÷ÕßÀàÐÍÖ¸¶¨Ãû³Æ # @param srcPos ¹¥»÷ÆðµãX/Y # @param index ¹¥»÷Ë÷Òý # @param resultList Òѱ»¹¥»÷Áбí # @param skillMatrix ¼¼ÄÜ·¶Î§¾ØÕó # @param gameMap µØÍ¼¹ÜÀíÆ÷ # @param tick µ±Ç°Ê±¼ä # @return Õæ/¼Ù ÊÇ·ñ¹¥»÷³É¹¦ # @remarks ¹¥»÷ÏÂÒ»¸öÁ´Ê½Ä¿±ê(ÈçÂÒ½£á÷»ê) def __DoNextDefender(attacker, curSkill, skillValue, skillPerList, attackObjName, srcPos, index, resultList, skillMatrix, gameMap, tick): isSucceed = False curSkillUseTag = SkillShell.GetSkillAffectTag(curSkill) hurtTypeList = ChConfig.Def_Dict_UseSkillTag_ObjType.get(curSkillUseTag) #ÕÒ²»µ½¹¥»÷¶ÔÏóÀàÐÍÔòÍ˳ö if hurtTypeList == None: GameWorld.ErrLog("Def_Dict_UseSkillTag_ObjType ûÓжÔÓ¦Ïî %s" % curSkillUseTag) return isSucceed for curPos in skillMatrix: #¹¥»÷³É¹¦ if isSucceed: #GameWorld.Log("2srcPos: %s"%srcPos) break #¼ì²éÓÐûÓжÔÏóÔÚÕâÒ»µãÉÏ mapObj = gameMap.GetPosObj(srcPos[0] + curPos[0], srcPos[1] + curPos[1]) if not mapObj: continue #±éÀúµ±Ç°µã¶ÔÏó for i in range(0, mapObj.GetObjCount()): curObj = mapObj.GetObjByIndex(i) curObjType = curObj.GetGameObjType() #²»Ôڿɹ¥»÷¶ÔÏóÁбíÖÐ if curObjType not in hurtTypeList: continue #¹¥»÷¶ÔÏó curTag = GameWorld.GetObj(curObj.GetID(), curObjType) if not curTag: continue #Á´Ê½¹¥»÷²»ÄܶÔïÚ³µÊÍ·Å if curObjType == IPY_GameWorld.gotNPC and curTag.GetGameNPCObjType() == IPY_GameWorld.gnotTruck: continue if __IsAlreadyAttack(curTag, resultList): continue #¾ßÌåÅж¨¶ÔÏóÊÇ·ñ¿É¹¥»÷ if not __DoAttack(attacker, curTag, curSkill, attackObjName, skillValue, skillPerList[index], g_skillHurtList, tick): continue resultList.append(curTag) #´Ó±»¹¥»÷Õß¿ªÊ¼ÖØÐ¼ÆËã×ø±ê srcPos[0] = curTag.GetPosX() srcPos[1] = curTag.GetPosY() isSucceed = True break return isSucceed ## ±¬ÁÑʽȺ¹¥ (½£Èë»ÆÈª) # @param attacker ¹¥»÷ÕßʵÀý # @param defender ·ÀÓùÕßʵÀý # @param srcPosX ¹¥»÷Æðµã×ø±êX # @param srcPosX ¹¥»÷Æðµã×ø±êY # @param curSkill ¼¼ÄÜʵÀý # @param skillPercent ¼¼ÄÜÔöÇ¿°Ù·Ö±È # @param skillEnhance ¼¼ÄÜÔöǿֵ # @param changePer ½¥±äÖµ # @param tick µ±Ç°Ê±¼ä # @param powerList Ë¥¼õ»òÔöÇ¿Áбí[ [skillPercent,skillEnhance],...... ] # @param isEnhanceSkill ÊÇ·ñÊǸ½¼Ó¼¼ÄÜ, ¸½¼Ó¼¼Äܲ»Í¨Öª¹¥»÷³É¹¦, Ò²²»Ôٴδ¥·¢ÆäËû¸½¼Ó¼¼ÄÜ # @return True # @remarks ±¬ÁÑʽȺ¹¥ (½£Èë»ÆÈª) def CrackAttackArea(attacker, defender, srcPosX, srcPosY, curSkill, skillPercent, skillEnhance, changePer, tick, powerList = [], isEnhanceSkill = False): #Çå¿ÕÉËѪÁбí global g_skillHurtList g_skillHurtList.Clear() attackList = [] #¹¥»÷·½Ô­ÓÐѪÁ¿,ÓÃÀ´Í¨Öª·´µ¯ attackerHP = GameObj.GetHP(attacker) #È¡µÃ¿É¹¥»÷¶ÔÏóÁбí resultList = __GetAreaAtackObj(attacker, curSkill, srcPosX, srcPosY, tick, __CheckCanAttack) #ÓÐÄ¿±êÀ༼ÄÜ,²éÕÒÖ¸¶¨µÄ¹¥»÷Ä¿±êÊÇ·ñÔÚÁбíÖÐ,²»ÔÚÌí¼Ó __AddObj_In_resultList(resultList, attacker, defender, curSkill, tick) for tagObj in resultList: dist = GameWorld.GetDist(tagObj.GetPosX(), tagObj.GetPosY(), defender.GetPosX(), defender.GetPosY()) skillPer = (skillPercent - dist * changePer) #GameWorld.Log("skillPer :%s"%skillPer) #Ö´ÐÐȺ¹¥ ²¢È¡µÃ±»¹¥»÷¶ÔÏóÁбí tmpList = __DoAreaAttack(attacker, curSkill, skillEnhance, skillPer, [tagObj], powerList, g_skillHurtList, tick) attackList.extend(tmpList) #Ö´ÐÐȺ¹¥½á¹û __DoAreaAttackResult(attacker, defender, curSkill, attackList, attackerHP, tick, isEnhanceSkill) return True ## ÎÞµÐÕ¶Ëæ»ú¹¥»÷·¶Î§ÄÚÄ¿±ê # @param attacker ¹¥»÷ÕßʵÀý # @param curSkill ¼¼ÄÜ # @param tick µ±Ç°Ê±¼ä # @return ÊÇ·ñ¹¥»÷³É¹¦ # @remarks ÎÞµÐÕ¶Ëæ»ú¹¥»÷·¶Î§ÄÚÄ¿±ê def SuperLinkRandomAttack(attacker, curSkill, tick): #·µ»ØÊÇ·ñ¹¥»÷³É¹¦£¬ÅжÏÒª²»ÒªÏÂÒ»´Î¹¥»÷ result = False defender = attacker.GetActionObj() if defender != None: defender = GameWorld.GetObjDetail(defender) attacker.SetActionObj(None) # #Í˳ö¶ÔÖÅ # attacker.SetIsConfronting(False) # #֪ͨ¿Í»§¶Ë //0½øÈë;ÆäËûÍ˳ö # attacker.View_PlayerBattle(0, 0, 1) #Ìí¼Ó²âÊÔÐÅÏ¢ GameWorld.GodLog(attacker, 'ÎÞµÐÕ¶£¬Í˳öÕ½¶·¶ÔÖųɹ¦') else: resultList = __GetAreaAtackObj(attacker, curSkill, attacker.GetPosX(), attacker.GetPosY(), tick, __CheckCanAttack) if resultList == []: return result defender = random.choice(resultList) #¹¥»÷Ä¿±ê result = SuperLinkAttackObj(attacker, defender, curSkill, tick) return result ## ÎÞµÐÕ¶¹¥»÷Ä¿±ê # @param attacker ¹¥»÷ÕßʵÀý # @param defender ·ÀÓù×ÅʵÀý # @param curSkill ¼¼ÄÜ # @param tick µ±Ç°Ê±¼ä # @return ÊÇ·ñ¹¥»÷³É¹¦ # @remarks ÎÞµÐÕ¶¹¥»÷Ä¿±ê def SuperLinkAttackObj(attacker, defender, curSkill, tick): #·µ»ØÊÇ·ñ¹¥»÷³É¹¦£¬ÅжÏÒª²»ÒªÏÂÒ»´Î¹¥»÷ result = False #---Ч¹û2 AֵΪ¹¥»÷¼¼ÄÜID--- attackSkillEff = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_SuperLinkAtk) curSkillLV = curSkill.GetSkillLV() curSkillID = curSkill.GetSkillID() #ûÓй¥»÷¼¼ÄÜ if attackSkillEff == None: GameWorld.ErrLog("ûÓÐÎ޵й¥»÷¼¼ÄÜЧ¹ûÏî%s ID=%s, Lv=%s" % (ChConfig.Def_Skill_Effect_SuperLinkAtk, curSkillID, curSkillLV)) return result attackSkillID = attackSkillEff.GetEffectValue(0) #Ïȼì²éÊý¾Ý¿âÓÐû¸ÃÀ༼ÄÜ£¬Èç¹û×î¸ßµÈ¼¶²»Ò»Ñù»áÕÒ²»µ½ attackSkill = GameWorld.GetGameData().FindSkillByType(attackSkillID, curSkillLV) #Òì³£ if not attackSkill: GameWorld.ErrLog("Êý¾Ý¿âûÓÐÎ޵й¥»÷¼¼ÄÜ ID = %s, skillLv = %s" % (attackSkillID, curSkillLV)) return result #ÕÒµ½±»¶¯¼¼ÄÜ£¬Ìí¼Ó±©»÷ÂÊ #---Ч¹û4 AֵΪ±»¶¯¼¼ÄÜID, ±»¶¯¼¼ÄܵÄЧ¹û2Ôö¼Ó±©»÷--- passiveSkill = SkillCommon.GetSkillFromOtherSkillByEffectID(attacker, curSkill, ChConfig.Def_Skill_Effect_PassiveSkillID) beforeSuperHitRate = attacker.GetSuperHitRate() #¸Ã±»¶¯¼¼ÄÜÒÑѧ if passiveSkill != None and SkillCommon.isPassiveSkill(passiveSkill): superHitEff = SkillCommon.GetSkillEffectByEffectID(passiveSkill, ChConfig.Def_Skill_Effect_SuperAtkSHit) if superHitEff != None: superHitRate = superHitEff.GetEffectValue(0) superHitPer = (ChConfig.Def_MaxRateValue + superHitEff.GetEffectValue(1)) / float(ChConfig.Def_MaxRateValue) #ÉèÖÃеı©»÷ÂÊ attacker.SetSuperHitRate(int(max(beforeSuperHitRate, superHitRate) * superHitPer)) else: GameWorld.ErrLog("ûÓб©»÷Ч¹ûÏî%s ID=%s, Lv=%s" % (ChConfig.Def_Skill_Effect_SuperAtkSHit, passiveSkill.GetSkillID(), passiveSkill.GetSkillLV())) #ÉèÖù¥»÷ÆðµãÎªÍæ¼Ò×ÔÉí×ø±ê attacker.SetAttackTargetPos(attacker.GetPosX(), attacker.GetPosY()) result = SkillShell.DoLogic_UseSkill(attacker, defender, attackSkill, tick) attacker.SetSuperHitRate(beforeSuperHitRate) return result ## ½£Èз籩¹¥»÷ # @param attacker ¹¥»÷ÕßʵÀý # @param srcPosX ¹¥»÷Æðµã×ø±êX # @param srcPosX ¹¥»÷Æðµã×ø±êY # @param curSkill ¼¼ÄÜʵÀý # @param skillPercent ¼¼ÄÜÔöÇ¿°Ù·Ö±È # @param skillEnhance ¼¼ÄÜÔöǿֵ # @param skillMatrix Ö¸¶¨¹¥»÷¾ØÕó # @param tick µ±Ç°Ê±¼ä # @return ÎÞ # @remarks ½£Èз籩¹¥»÷ def SwordStormAttack(attacker, srcPosX, srcPosY, curSkill, skillPercent, skillEnhance, skillMatrix, tick): #Çå¿ÕÉËѪÁбí global g_skillHurtList g_skillHurtList.Clear() resultList = __GetAreaAtackObj(attacker, curSkill, srcPosX, srcPosY, tick, __CheckCanAttack, skillMatrix) attackList = __DoAreaAttack(attacker, curSkill, skillEnhance, skillPercent, resultList, [], g_skillHurtList, tick) #²»Í¨Öª¹¥»÷³É¹¦°ü Ö»¹ã²¥µôѪ #=========================================================================== # for index in range(g_skillHurtList.GetHurtCount()): # hurtObj = g_skillHurtList.GetHurtAt(index) # # curObj = GameWorld.GetObj(hurtObj.GetObjID(), hurtObj.GetObjType()) # # if curObj == None: # continue # # curObj.ChangeHPView(curSkill.GetSkillTypeID(), hurtObj.GetHurtHP(), hurtObj.GetHurtHPEx(), hurtObj.GetAttackType()) # # SkillCommon.NotifyNPCHP(curObj) #=========================================================================== Sync_SkillHurtList(attacker, curSkill.GetSkillID(), srcPosX, srcPosY, g_skillHurtList) OnHurtTypeTriggerPassiveSkill(attacker, None, curSkill, tick) skillIDSet = set() #¹¥»÷½á¹û ²»´¦Àí´¥·¢Âß¼­ for defObj in attackList: #Òò¹¥»÷½áÊø¶¯×÷ÖУ¬·¨±¦¹¥»÷½«µ¼ÖÂÄ¿±êËÀÍö¡£ÒªÅж¨ºóÔڴε÷Ó㬱ÜÃâ2´Î->AttackResult if AttackCommon.GetIsDead(defObj): continue #·ÅÔÚº¯ÊýÖпɶà´Î´¥·¢ ÈçSP ´¥·¢¼õËÙ»òÕßÉ˺¦£¬µ«²»ÄÜ·ÅÔÚ¹¥»÷¼ÆËãÖУ¬ÒòΪÉ˺¦Ðͼ¼ÄÜ»áÓ°ÏìÉËѪÁбí PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defObj, curSkill, ChConfig.TriggerType_StormAttackOneByOne, tick, isEnhanceSkill=False, skillIDSet=skillIDSet) DoLogic_AttackResult(attacker, defObj, curSkill, tick) #======================================================================= # #Êܹ¥»÷¶ÔÏó1V1´¥·¢¼¼ÄÜ,±¾¼¼ÄÜЧ¹û×ÔÉí¸½´ø£¬·Ç±»¶¯£¬·Ç´¥·¢¼¼ÄÜ # skillEffect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_ProcessAttack) # if skillEffect: # skillID = skillEffect.GetEffectValue(2) # if skillID != 0: # triggerSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID) # if not triggerSkill: # continue # SkillShell.UsePassiveTriggerSkill(attacker, triggerSkill, defObj, tick) #======================================================================= # Ò»Ò»´¥·¢¼¼ÄÜÐèÒªÔÚ×îºóÉèÖÃCD for skillTypeID in skillIDSet: curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID) if not curSkill: continue SkillCommon.SetSkillRemainTime(curSkill, 0, tick, attacker) if attackList: PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(attacker, attackList[0], curSkill, ChConfig.TriggerType_StormAttackReduceCD) PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, attackList[0], curSkill, ChConfig.TriggerType_StormAttackOver, tick) ## Çå¿ÕÉËѪÁбí # @param ÎÞ # @return ÎÞ # @remarks Çå¿ÕÉËѪÁбí ÓÃÓÚÊͷż¼ÄÜ´¦ÀíÂß¼­Ç°Çå def ClearSkillHurtList(): global g_skillHurtList g_skillHurtList.Clear() ## »ñÈ¡·ÀÊØÕߵı»¹¥»÷ÀàÐÍ # @param defender ·ÀÊØÕß # @return ¹¥»÷ÀàÐÍ # @remarks »ñÈ¡·ÀÊØÕߵı»¹¥»÷ÀàÐÍ def GetHurtType(defender): if defender == None: return ChConfig.Def_HurtType_Normal #ÔÚÉËѪÁбíÖÐÕÒ³ö·ÀÊØ·½µÄÉËѪ½á¹¹ for index in range(g_skillHurtList.GetHurtCount()): hurtObj = g_skillHurtList.GetHurtAt(index) curObj = GameWorld.GetObj(hurtObj.GetObjID(), hurtObj.GetObjType()) if curObj == None: continue if not GameWorld.IsSameObj(curObj, defender): continue return hurtObj.GetAttackType() return ChConfig.Def_HurtType_Normal ## °´°Ù·Ö±ÈȺÌå¿ÛѪ # @param attacker ¹¥»÷ÕßʵÀý # @param defender ·ÀÓùÕßʵÀý # @param srcPosX ¹¥»÷Æðµã×ø±êX # @param srcPosX ¹¥»÷Æðµã×ø±êY # @param curSkill ¼¼ÄÜʵÀý # @param tick µ±Ç°Ê±¼ä # @param isExSkill ÊÇ·ñÊǸ½¼Ó¼¼ÄÜ, ¸½¼Ó¼¼Äܲ»Í¨Öª¹¥»÷³É¹¦, Ò²²»Ôٴδ¥·¢ÆäËû¸½¼Ó¼¼ÄÜ # @param skillMatrix ¹¥»÷¾ØÕó # @return True # @remarks º¯ÊýÏêϸ˵Ã÷. def AttackerSkillAttackAreaLostHP(attacker, defender, srcPosX, srcPosY, curSkill, tick, isExSkill = False, skillMatrix = None): #Çå¿ÕÉËѪÁбí global g_skillHurtList g_skillHurtList.Clear() #¹¥»÷·½Ô­ÓÐѪÁ¿,ÓÃÀ´Í¨Öª·´µ¯ attackerHP = GameObj.GetHP(attacker) resultList = __GetAreaAtackObj(attacker, curSkill, srcPosX, srcPosY, tick, __CheckCanAttack, skillMatrix) #ÓÐÄ¿±êÀ༼ÄÜ,²éÕÒÖ¸¶¨µÄ¹¥»÷Ä¿±êÊÇ·ñÔÚÁбíÖÐ,²»ÔÚÌí¼Ó resultList = __AddObj_In_resultList(resultList, attacker, defender, curSkill, tick) #GameWorld.Log("ʹÓÃÎÞÖ¸¶¨´ÎÊýȺ¹¥¼¼ÄÜ = %s ³É¹¦,¸½¼Ó¼¼ÄÜЧ¹û = %s,¸½¼Ó¼¼ÄÜÔöÇ¿ = %s"%\ #(curSkill.GetSkillName(),skillValue,skillPer)) attackList = __DoAreaAttackLostHP(attacker, curSkill, resultList, g_skillHurtList, tick) __DoAreaAttackResult(attacker, defender, curSkill, attackList, attackerHP, tick, isExSkill) return True ## Ö´Ðа´°Ù·Ö±ÈȺÌå¿ÛѪ # @param attacker ¹¥»÷ÕßʵÀý # @param curSkill ¼¼ÄÜʵÀý # @param resultList ¹¥»÷¶ÔÏóÁбí # @param skillHurtList ÉËѪÁбí # @param tick µ±Ç°Ê±¼ä # @return ÎÞ # @remarks def __DoAreaAttackLostHP(attacker, curSkill, resultList, skillHurtList, tick): attackList = [] #±»¹¥»÷¶ÔÏóÁбí checkComboOK = False #Ö´Ðй¥»÷½á¹û for obj in resultList: callName = "%s_Attack_%s.%s" % (GetObjAttackName(attacker), GetObjAttackName(obj), "DoAttack") callFunc = GameWorld.GetExecFunc(AttackLogic, callName) if not callFunc: continue if not checkComboOK: #¹¥»÷ǰÁ¬»÷¼ì²é SkillCommon.UpdateSkillCombo(attacker, curSkill, tick) checkComboOK = True curObjMaxHp = GameObj.GetMaxHP(obj) rate = curSkill.GetEffect(0).GetEffectValue(0) / float(ChConfig.Def_MaxRateValue) # ¿ÛѪµÄ°Ù·Ö±È lostHP = int(curObjMaxHp * rate) callFunc(attacker, obj, curSkill, lostHP, 0, skillHurtList, tick) attackList.append(obj) return attackList # Òý±¬ÊÓÒ°ÄÚµÄÖÖ×Ó def AttackDetonateSeed(attacker, curSkill, seedTypeID, tick, owner=None): if not seedTypeID: return buffSkill = GameWorld.GetGameData().GetSkillBySkillID(seedTypeID) if not buffSkill: return buffType = SkillCommon.GetBuffType(buffSkill) if owner: ownerID, ownerType = owner.GetID(), owner.GetGameObjType() else: ownerID, ownerType = attacker.GetID(), attacker.GetGameObjType() GameWorld.DebugLog("ownerID---%s-%s"%(ownerID, ownerType)) #Çå¿ÕÉËѪÁбí global g_skillHurtList g_skillHurtList.Clear() hurtPer = 0 attackerHP = GameObj.GetHP(attacker) attackList = [] seeObjCount = attacker.GetInSightObjCount() for i in range(0, seeObjCount): seeObj = attacker.GetInSightObjByIndex(i) #ÓпÉÄÜΪ¿Õ if seeObj == None : continue seeObjType = seeObj.GetGameObjType() #²»ÊÇÍæ¼Ò if seeObjType not in [IPY_GameWorld.gotPlayer, IPY_GameWorld.gotNPC] : continue if seeObj.IsEmpty(): continue #ÒѾ­ËÀÍö if GameObj.GetHP(seeObj) <= 0 : continue #ÒþÉí if seeObj.GetVisible() == False: continue tagObj = GameWorld.GetObj(seeObj.GetID(), seeObjType) if not tagObj: continue buffTuple = SkillCommon.GetBuffManagerByBuffType(tagObj, buffType) #ͨ¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷Ϊ¿Õ£¬ÔòÌø³ö if buffTuple == (): continue buffManager = buffTuple[0] buff = buffManager.FindBuff(seedTypeID) if not buff: continue if buff.GetOwnerID() != ownerID or buff.GetOwnerType() != ownerType: # ·ÇËùÊôBUFF continue if not hurtPer: curBuffSkill = buff.GetSkill() hurtEffect = SkillCommon.GetSkillEffectByEffectID(curBuffSkill, ChConfig.Def_Skill_Effect_BoomSeedHurt) if not hurtEffect: continue hurtPer = hurtEffect.GetEffectValue(0) # µ¥²ãÉ˺¦ # É˺¦³ËÒÔ²ã skillPercent = hurtPer * max(buff.GetLayer(), 1) DoAttackSingle(attacker, tagObj, curSkill, 0, skillPercent, tick) attackList.append(tagObj) # ½áÊø´¦Àí DoAttackSuccessEx(attacker, attackerHP, None, curSkill, tick) for defObj in attackList: if AttackCommon.GetIsDead(defObj): continue DoLogic_AttackResult(attacker, defObj, curSkill, tick) return True #µ¥Ò»¶ÔÏó¼ÆËã¹¥»÷É˺¦£¬ÈçÓÃÓÚÖÖ×Ó±¬Õ¨ def DoAttackSingle(attacker, obj, curSkill, skillEnhance, skillPercent, tick): callName = "%s_Attack_%s.%s" % (GetObjAttackName(attacker), GetObjAttackName(obj), "DoAttack") callFunc = GameWorld.GetExecFunc(AttackLogic, callName) if not callFunc: return callFunc(attacker, obj, curSkill, skillEnhance, skillPercent, g_skillHurtList, tick) return obj ## È¡Ïû±»ÇøÓòÄÚ¶ÔÏó¶ÔÖÅÑ¡ÖÐ # @param attacker ¹¥»÷ÕßʵÀý # @param curSkill ¼¼ÄÜʵÀý # @param srcPosX Êͷż¼ÄÜÆðµã×ø±êX # @param srcPosY Êͷż¼ÄÜÆðµã×ø±êY # @param tick µ±Ç°Ê±¼ä # @return ÎÞ def CancelAreaActioned(attacker, curSkill, srcPosX, srcPosY, tick): #È¡µÃÊÜЧ¹ûÄ¿±ê¶ÓÁÐ resultList = __GetAreaAtackObj(attacker, curSkill, srcPosX, srcPosY, tick, CheckTagIsBeInfection) # ֪ͨȡÏûÑ¡ÖÐÍæ¼ÒÁбí #GameWorld.DebugLog("resultList=%s" % resultList) for curTag in resultList: # ²»ÊÇÍæ¼Ò²»´¦Àí if curTag.GetGameObjType() != IPY_GameWorld.gotPlayer: continue curTagID = curTag.GetPlayerID() curActionObj = curTag.GetActionObj() if not curActionObj: #GameWorld.DebugLog("curTagID=%s, not actionObj" % curTagID) continue # ¶ÔÖÅÄ¿±ê²»ÊÇÍæ¼Ò²»´¦Àí if curActionObj.GetGameObjType() != IPY_GameWorld.gotPlayer: #GameWorld.DebugLog("curTagID=%s, actionObj not gotPlayer" % curTagID) continue actionPlayer = GameWorld.GetObjDetail(curActionObj) # Èç¹ûÑ¡ÖÐÕßÊÇÊͷż¼ÄÜÍæ¼Ò£¬ÔòÈ¡Ïû¶ÔÆäÑ¡ÖÐ if actionPlayer.GetPlayerID() == attacker.GetPlayerID(): curTag.SetActionObj(None) # ·â°ü֪ͨ¶Ô·½£¬È¡ÏûÑ¡ÖÐ PlayerControl.Sync_SelectObj(curTag, IPY_GameWorld.gotPlayer, actionPlayer.GetPlayerID(), 0) return # Íæ¼Ò·ÇÖ±½ÓÊͷŵļ¼Äܳɹ¦°üÓÉ´Ë·â°ü´¦Àí£¬Âß¼­Àà0614 0604 # attacker.View_UseSkillPos(skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList) def Sync_SkillHurtList(curPlayer, skillID, posX, posY, skillHurtList): if curPlayer.GetGameObjType() != IPY_GameWorld.gotPlayer: return sendPack = ChPyNetSendPack.tagMCSkillHurtList() sendPack.Clear() sendPack.ObjID = curPlayer.GetID() sendPack.ObjType = IPY_GameWorld.gotPlayer sendPack.SkillID = skillID sendPack.PosX = posX sendPack.PosY = posY for i in range(skillHurtList.GetHurtCount()): hurtObj = skillHurtList.GetHurtAt(i) hurtList = ChPyNetSendPack.tagSkillPosHurtObj() hurtList.ObjType = hurtObj.GetObjType() hurtList.ObjID = hurtObj.GetObjID() hurtList.AttackType = hurtObj.GetAttackType() hurtList.HurtHP = hurtObj.GetHurtHP() hurtList.HurtHPEx = hurtObj.GetHurtHPEx() hurtList.CurHP = hurtObj.GetCurHP() hurtList.CurHPEx = hurtObj.GetCurHPEx() sendPack.HurtList.append(hurtList) sendPack.HurtCount = len(sendPack.HurtList) sendPack.SkillElementID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % skillID) PlayerControl.PyNotifyAll(curPlayer, sendPack, notifySelf=True, notifyCnt=-1) return # pyÖØÏÖView_UseSkillPosЧ¹û£¬¶ÔµØÍ¨Öª£¬Ö»ÓÃÓÚÍæ¼Ò def PYView_UseSkillPos(attacker, skillID, battleType, useSkillPosX, useSkillPosY, skillHurtList, notifySelf): #=========================================================================== # C++ ´Ë´¦´úÂëPYÒÑ´¦Àí£¬Ôݲ»¼ÓÈë # SetAttackTick(GetGameWorldManager()->GetTick()); # ChangeAction(paAttack); # m_LastBattleTick = GetGameWorldManager()->GetTick(); #=========================================================================== sendPack = ChNetSendPack.tagUseSkillPos() sendPack.Clear() sendPack.ObjID = attacker.GetID() sendPack.ObjType = attacker.GetGameObjType() sendPack.BattleType = battleType sendPack.SkillID = skillID sendPack.PosX = useSkillPosX sendPack.PosY = useSkillPosY for i in range(skillHurtList.GetHurtCount()): hurtObj = skillHurtList.GetHurtAt(i) hurtList = ChNetSendPack.tagSkillPosHurtObj() hurtList.ObjType = hurtObj.GetObjType() hurtList.ObjID = hurtObj.GetObjID() hurtList.AttackType = hurtObj.GetAttackType() hurtList.HurtHP = hurtObj.GetHurtHP() hurtList.HurtHPEx = hurtObj.GetHurtHPEx() hurtList.CurHP = hurtObj.GetCurHP() hurtList.CurHPEx = hurtObj.GetCurHPEx() sendPack.HurtList.append(hurtList) sendPack.HurtCount = len(sendPack.HurtList) if attacker.GetGameObjType() == IPY_GameWorld.gotPlayer: sendPack.SkillElementID = attacker.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % skillID) PlayerControl.PyNotifyAll(attacker, sendPack, notifySelf, -1) else: attacker.NotifyAll(sendPack.GetBuffer(), sendPack.GetLength()) return # Íæ¼Ò×ÔÉíÒªÌØÊâ¹ýÂË֪ͨ def PYView_UseSkillPos_NotifySelf(curPlayer, skillID, battleType, useSkillPosX, useSkillPosY, skillHurtList): #=========================================================================== # C++ ´Ë´¦´úÂëPYÒÑ´¦Àí£¬Ôݲ»¼ÓÈë # SetAttackTick(GetGameWorldManager()->GetTick()); # ChangeAction(paAttack); # m_LastBattleTick = GetGameWorldManager()->GetTick(); #=========================================================================== useSkillData = curPlayer.GetUseSkill() useSkillID = useSkillData.GetSkillID() if useSkillData else 0 sendPack = ChNetSendPack.tagUseSkillPos() sendPack.Clear() sendPack.ObjID = curPlayer.GetID() sendPack.ObjType = IPY_GameWorld.gotPlayer sendPack.BattleType = battleType sendPack.SkillID = skillID sendPack.PosX = useSkillPosX sendPack.PosY = useSkillPosY for i in range(skillHurtList.GetHurtCount()): hurtObj = skillHurtList.GetHurtAt(i) # ¿Í»§¶Ë¼ÆËãÉ˺¦²»Í¨Öª×Ô¼º if useSkillID == skillID and SkillShell.isClientHurtValue(hurtObj.GetObjID(), hurtObj.GetObjType()): continue hurtList = ChNetSendPack.tagSkillPosHurtObj() hurtList.ObjType = hurtObj.GetObjType() hurtList.ObjID = hurtObj.GetObjID() hurtList.AttackType = hurtObj.GetAttackType() hurtList.HurtHP = hurtObj.GetHurtHP() hurtList.HurtHPEx = hurtObj.GetHurtHPEx() hurtList.CurHP = hurtObj.GetCurHP() hurtList.CurHPEx = hurtObj.GetCurHPEx() sendPack.HurtList.append(hurtList) sendPack.HurtCount = len(sendPack.HurtList) sendPack.SkillElementID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % skillID) NetPackCommon.SendFakePack(curPlayer, sendPack) return