| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #  | 
| ##@package E:/GameSVN/U3DGame/ProjectSServer/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py  | 
| # @todo:   | 
| #  | 
| # @author: Alee  | 
| # @date 2017-10-24 ÏÂÎç08:46:55  | 
| # @version 1.0  | 
| #  | 
| # @note:   | 
| #  | 
| #---------------------------------------------------------------------  | 
| import ChConfig  | 
| import NPCCommon  | 
| import GameWorld  | 
| import IPY_GameWorld  | 
| import PlayerControl  | 
| import GameSkills  | 
| import BuffSkill  | 
| import AttackCommon  | 
| import GameMap  | 
| import EffGetSet  | 
| import FBLogic  | 
| import ReadChConfig  | 
| import random  | 
| import BaseAttack  | 
| import PetControl  | 
| import SkillShell  | 
| import DataRecordPack  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import ShareDefine  | 
| import GameObj  | 
| import PassiveBuffEffMng  | 
| #---------------------------------------------------------------------  | 
|   | 
| #---------------------------------------------------------------------  | 
| ## Í¨¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷  | 
| #  @param curObj Ä¿±ê  | 
| #  @param buffType buffÀàÐÍ  | 
| #  @return ¹ÜÀíÆ÷£¬×î´ó¸öÊý£¬Ð§¹ûÊÇ·ñ¿Éµþ¼Ó  | 
| def GetBuffManagerByBuffType(curObj, buffType):  | 
|     # Í³Ò»Ö»ÓÃÒ»¸ö  Def_Max_Buff_Count  | 
|     if buffType == IPY_GameWorld.bfBuff:  | 
|         return (curObj.GetBuffState(), ChConfig.Def_Max_Buff_Count, False)  | 
|     elif buffType == IPY_GameWorld.bfDeBuff:  | 
|         return (curObj.GetDeBuffState(), ChConfig.Def_Max_Buff_Count, False)  | 
|     elif buffType == IPY_GameWorld.bfAura:  | 
|         return (curObj.GetAura(), ChConfig.Def_Max_Buff_Count, False)  | 
|     elif buffType == IPY_GameWorld.bfIncBuff:  | 
|         return (curObj.GetIncBuff(), ChConfig.Def_Max_Buff_Count, True)  | 
|     elif buffType == IPY_GameWorld.bfEquipBuff:  | 
|         return (curObj.GetEquipBuff(), ChConfig.Def_Max_Buff_Count, True)  | 
|     elif buffType == IPY_GameWorld.bfMapBuff:  | 
|         return (curObj.GetMapBuff(), ChConfig.Def_Max_Buff_Count, False)  | 
|     elif buffType == IPY_GameWorld.btPassiveBuf:  | 
|         return (curObj.GetPassiveBuf(), ChConfig.Def_Max_Buff_Count, True)  | 
|     elif buffType == IPY_GameWorld.bfActionBuff:  | 
|         return (curObj.GetActionBuffManager(), ChConfig.Def_Max_Buff_Count, False)  | 
|     elif buffType == IPY_GameWorld.bfProcessBuff:  | 
|         return (curObj.GetProcessBuffState(), ChConfig.Def_Max_Buff_Count, False)  | 
|     elif buffType == IPY_GameWorld.bfProcessDeBuff:  | 
|         return (curObj.GetProcessDeBuffState(), ChConfig.Def_Max_Buff_Count, False)  | 
|       | 
|     #ÎÊÌâÇë²éÕÒDef_SkillType_CountºÍDef_SkillBuffListÕâ2ÕÅ±í  | 
|     GameWorld.ErrLog('ÎÞ·¨»ñÈ¡¼¼ÄÜÀàÐÍ = %s' % (buffType))  | 
|     return ()  | 
|   | 
| ## ÅжÏÊÇ·ñΪBuff:  | 
| #  @param curSkill ¼¼ÄÜ  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def IsBuff(curSkill):  | 
|     return ChConfig.Def_SkillBuffList.has_key(curSkill.GetSkillType())  | 
|   | 
| ## ·µ»ØBuffÀàÐÍ  | 
| #  @param ¼¼ÄÜ  | 
| #  @return buffÀàÐÍ  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def GetBuffType(curSkill):  | 
|     return ChConfig.Def_SkillBuffList.get(curSkill.GetSkillType())  | 
|   | 
| def GetBuffStateType(curSkill):  | 
|     # buffËùÊôµÄ״̬ÀàÐÍ£¬¶ÔÓ¦ ChConfig.Def_PlayerStateList  | 
|     curEffect = GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_BuffState)  | 
|     if curEffect == None:  | 
|         return ChConfig.Def_PlayerState_Normal  | 
|     return curEffect.GetEffectValue(0)  | 
|   | 
| ## ÉèÖõ±Ç°¼¼ÄܵÄÊ£Óàʱ¼ä(ÔÚ¼¼Äܳɹ¦µÄʱºòµ÷ÓÃ)  | 
| #  @param curSkill µ±Ç°¼¼ÄÜ  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def SetSkillRemainTime(curSkill, reduceSkillCDPer, tick, atkObj=None):  | 
|     #GameWorld.Log(GameWorld.GetScript().OutputTrace())  | 
|     curSkill.SetLastUseTick(tick)  | 
|     coolDownTime = curSkill.GetCoolDownTime()  | 
|     remainTime = coolDownTime  | 
|     if isPassiveSkill(curSkill):  | 
|         # ±»¶¯¼¼ÄܵĴ¦ÀíºÍÖ÷¶¯¼¼ÄÜÇø·Ö  | 
|         curSkill.SetRemainTime(remainTime)  | 
|         return  | 
|       | 
|     # ¼õCD¹Ì¶¨Öµ  | 
|     #if skillData and skillData.GetCoolDownTime() < remainTime:  | 
|     #    remainTime = skillData.GetCoolDownTime()  | 
|       | 
|     reduceSkillCDPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, None, curSkill, ChConfig.TriggerType_ReduceCD)  | 
|     # ¼õCD±ÈÂÊ  | 
|     if reduceSkillCDPer > 0:  | 
|         remainTime = int(remainTime * max(0, ShareDefine.Def_MaxRateValue - reduceSkillCDPer) / ShareDefine.Def_MaxRateValue)  | 
|       | 
|     curSkill.SetRemainTime(remainTime)  | 
|     if coolDownTime != remainTime:  | 
|         curSkill.Sync_Skill()  | 
|       | 
|     #GameWorld.Log("¼¼ÄÜ: %s Ê£Óàʱ¼ä:¡¡%d"%(curSkill.GetSkillName(), curSkill.GetRemainTime()))  | 
|     return  | 
|   | 
| ## Ë¢Ðµ±Ç°¼¼ÄÜÊ£Óàʱ¼ä  | 
| #  @param curSkill µ±Ç°¼¼ÄÜ  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return µ±Ç°¼¼ÄÜÊ£Óàʱ¼ä:ºÁÃë  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def RefreshSkillRemainTime(curSkill, tick):  | 
|     #GameWorld.Log("ˢм¼ÄÜ: %s Ê£Óàʱ¼ä:¡¡%d   %s %s"%(curSkill.GetSkillName(), curSkill.GetRemainTime(), tick, curSkill.GetLastUseTick()))  | 
|     remainTime_Old = curSkill.GetRemainTime()  | 
|     #´Ë¼¼ÄÜÒѾÎÞÀäÈ´CDÁË  | 
|     if remainTime_Old == 0:  | 
|         return remainTime_Old  | 
|       | 
|     remainTime_New = max(0, remainTime_Old - (tick - curSkill.GetLastUseTick()))  | 
|   | 
|     curSkill.SetLastUseTick(tick)  | 
|     curSkill.SetRemainTime(remainTime_New)  | 
|     return remainTime_New  | 
|   | 
| ## Ë¢ÐÂÍæ¼ÒËùÓм¼ÄܵÄÊ£Óàʱ¼ä(ÏÂÏß)  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def RefreshAllSkillRemainTime(curPlayer, tick):  | 
|     #ˢм¼ÄÜÊ£Óàʱ¼ä  | 
|     skillManager = curPlayer.GetSkillManager()  | 
|       | 
|     for i in range(0, skillManager.GetSkillCount()):  | 
|         curSkill = skillManager.GetSkillByIndex(i)  | 
|   | 
|         if curSkill.GetRemainTime() == 0 :  | 
|             continue  | 
|           | 
|         RefreshSkillRemainTime(curSkill, tick)  | 
|   | 
|     return  | 
|   | 
| ## Íæ¼ÒÇл»µØÍ¼£¬Ë¢Ð¼¼ÄÜCD  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def PlayerChangeMapUpdateSkillCD(curPlayer, tick):  | 
|     skillManager = curPlayer.GetSkillManager()  | 
|   | 
|     for i in range(0, skillManager.GetSkillCount()):  | 
|         curSkill = skillManager.GetSkillByIndex(i)  | 
|   | 
|         if curSkill.GetRemainTime() == 0 :  | 
|             continue  | 
|   | 
|         #GameWorld.Log("Çл»µØÍ¼, ¼¼ÄÜ%s³ÖÐøÊ±¼ä = %d"%(curSkill.GetSkillName(), skillRemainTime) , curPlayer.GetPlayerID())  | 
|         curSkill.SetLastUseTick(tick)  | 
|   | 
|     return  | 
|   | 
| ## Íæ¼ÒµÇ¼¼ì²éѧϰ¼¼ÄÜ(ÉÏÏß)  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| def PlayerLoginCheckLearnSkill(curPlayer):  | 
|       | 
|     jobLearnSkillDict = ReadChConfig.GetEvalChConfig("LoginLearnSkill")  | 
|     jobType = ChConfig.JOB_TYPE_DICT[curPlayer.GetJob()]  | 
|       | 
|     if jobType not in jobLearnSkillDict:  | 
|         return  | 
|           | 
|     learnSkillList = jobLearnSkillDict[jobType]  | 
|       | 
|     skillManager = curPlayer.GetSkillManager()  | 
|     gameData = GameWorld.GetGameData()  | 
|     for skillID in learnSkillList:  | 
|           | 
|         curSkill = gameData.GetSkillBySkillID(skillID)  | 
|         if not curSkill:  | 
|             GameWorld.ErrLog('DataBase No SkillId:%d' % skillID)  | 
|             continue  | 
|           | 
|         curSkillTypeID = curSkill.GetSkillTypeID()  | 
|           | 
|         # ÒÑѧϰ  | 
|         if skillManager.FindSkillBySkillTypeID(curSkillTypeID):  | 
|             continue  | 
|           | 
|         skillManager.LVUpSkillBySkillTypeID(curSkillTypeID)  | 
|         DataRecordPack.DR_LearnORUPSkill(curPlayer, curSkillTypeID, 1)  | 
|         GameWorld.Log("ÉÏÏßѧϰ¼¼ÄÜ£º%s" % curSkillTypeID, curPlayer.GetPlayerID())  | 
|               | 
|     return  | 
|   | 
| ## Íæ¼ÒµÇ½¿ç·þ·þÎñÆ÷¼¼ÄÜÏà¹Ø´¦Àí  | 
| def PlayerLoginMergeServerSkillLogic(curPlayer, tick):  | 
|     playerID = curPlayer.GetPlayerID()  | 
|   | 
|     if not GameWorld.IsMergeServer():  | 
|         GameWorld.DebugLog("·Ç¿ç·þ·þÎñÆ÷ÉÏÏß²»Çå³ýbuff...", playerID)  | 
|         return  | 
|       | 
|     ClearBuffSkillTypeIDList = ReadChConfig.GetEvalChConfig("ClearBuffSkillTypeID")  | 
|     # ¿ç·þ·þÎñÆ÷ÉÏÏßÇå³ýÔöÒæ/¼õÒæbuff  | 
|     GameWorld.Log("¿ç·þ·þÎñÆ÷ÉÏÏßÇå³ýbuff...", playerID)  | 
|     clearBuffList = [] # ÏÈ»ã×ÜÔÙÇå³ý£¬²»È»Ë÷Òý»á±ä¸ü  | 
|     for buffType in range(IPY_GameWorld.bfBuff, IPY_GameWorld.btBufMax):  | 
|           | 
|         buffTuple = GetBuffManagerByBuffType(curPlayer, buffType)  | 
|           | 
|         if buffTuple == ():  | 
|             GameWorld.DebugLog("    buffTuple == () buffType=%s" % buffType)  | 
|             continue  | 
|           | 
|         buffState = buffTuple[0]  | 
|         buffCnt = buffState.GetBuffCount()  | 
|         if buffCnt <= 0:  | 
|             continue  | 
|           | 
|         GameWorld.Log("    buffType=%s,buffCnt=%s" % (buffType, buffCnt), playerID)  | 
|           | 
|         for i in range(buffCnt):  | 
|             curBuff = buffState.GetBuff(i)  | 
|             if not curBuff:  | 
|                 GameWorld.DebugLog("    buffType=%s,i=%s  not curBuff" % (buffType, i))  | 
|                 continue  | 
|               | 
|             curSkill = curBuff.GetSkill()  | 
|             if not curSkill:  | 
|                 GameWorld.DebugLog("    buffType=%s,i=%s not curSkill" % (buffType, i))  | 
|                 continue  | 
|               | 
|             skillTypeID = curSkill.GetSkillTypeID()  | 
|             skillName = curSkill.GetSkillName()  | 
|             if skillTypeID not in ClearBuffSkillTypeIDList:  | 
|                 GameWorld.DebugLog("    buffType=%s,i=%s,skillTypeID=%s,skillName=%s not in clearList"   | 
|                                    % (buffType, i, skillTypeID, skillName), playerID)  | 
|                 continue  | 
|               | 
|             clearBuffList.append(curSkill.GetSkillID())  | 
|             GameWorld.Log("        addClearBuff buffType=%s,i=%s,skillName=%s,skillID=%d,skillTypeID=%d"   | 
|                           % (buffType, i, skillName, curSkill.GetSkillID(), skillTypeID), playerID)  | 
|               | 
|     # Çå³ýbuff  | 
|     #GameWorld.DebugLog("    clearBuffDict=%s" % str(clearBuffDict), playerID)  | 
|     for skillID in clearBuffList:  | 
|         BuffSkill.DelBuffBySkillID(curPlayer, skillID, tick)  | 
|         GameWorld.DebugLog("        delBuff skillID=%d" % (skillID), playerID)  | 
|    | 
|     skillManager = curPlayer.GetSkillManager()  | 
|     # ÖØÖÃËùÓм¼ÄÜCD  | 
|     for i in range(0, skillManager.GetSkillCount()):  | 
|         curSkill = skillManager.GetSkillByIndex(i)  | 
|         if curSkill.GetRemainTime() != 0:  | 
|             curSkill.SetRemainTime(0)  | 
|             GameWorld.DebugLog("        SetRemainTime 0 skillName=%s,skillTypeID=%s"   | 
|                                % (curSkill.GetSkillName(), curSkill.GetSkillTypeID()), playerID)  | 
|     return  | 
|   | 
| ## Ë¢ÐÂÍæ¼ÒËùÓм¼ÄܵÄÊ£Óàʱ¼ä(ÉÏÏß)  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def PlayerLoginUpdateSkillCD(curPlayer, tick):  | 
|     #»ñÈ¡Íæ¼ÒÀ뿪µØÍ¼Ê±¼ä  | 
|     leaveServerSeconds = PlayerControl.GetPlayerLeaveServerSecond(curPlayer)  | 
|   | 
|     if leaveServerSeconds <= 0:  | 
|         return  | 
|   | 
|     skillManager = curPlayer.GetSkillManager()  | 
|       | 
|     #===========================================================================  | 
|     # #ËùÓм¼ÄÜCDÖ»±£´æ1Ìì(³¬¹ýÒ»Ììʱ¼ä,È«²¿Çå¿Õ)  | 
|     # if leaveServerMinute > 24 * 60:  | 
|     #    #Èç¹ûÌìÊý²»Îª0, Çå¿ÕËùÓÐÊ£Óàʱ¼ä  | 
|     #    for i in range(0, skillManager.GetSkillCount()):  | 
|     #        curSkill = skillManager.GetSkillByIndex(i)  | 
|     #        curSkill.SetRemainTime(0)  | 
|     #          | 
|     #    return  | 
|     #===========================================================================  | 
|       | 
|     #ÏÂÏßʱ¼ä²»×ãÒ»Ìì, ½«¼¼ÄܵÄCDÉèÖÃΪ, ¼¼ÄÜÊ£ÓàCD-ÏÂÏßʱ¼ä  | 
|     for i in range(0, skillManager.GetSkillCount()):  | 
|         curSkill = skillManager.GetSkillByIndex(i)  | 
|         #Ê£Óàʱ¼äΪºÁÃë  | 
|         skillRemainTime = curSkill.GetRemainTime()  | 
|           | 
|         #¼¼ÄÜCDʱ¼äΪ0µÄ¼¼Äܲ»Ë¢Ð  | 
|         if skillRemainTime == 0:  | 
|             continue  | 
|   | 
|         lastTime = skillRemainTime - leaveServerSeconds * 1000  | 
|   | 
|         if lastTime <= 0:  | 
|             curSkill.SetRemainTime(0)  | 
|             continue  | 
|   | 
|         curSkill.SetLastUseTick(tick)  | 
|         curSkill.SetRemainTime(lastTime)  | 
|           | 
|     return  | 
|   | 
| ## ÕÙ»½·ÇÖ÷È˵ÄNPC  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curSkill ¼¼ÄÜʵÀý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return ÊÇ·ñ³É¹¦   | 
| #  @remarks ÕÙ»½·ÇÖ÷È˵ÄNPC  | 
| def SummonMapNPCBySkill(attacker, curSkill, tick):  | 
|     curPosX = attacker.GetPosX()  | 
|     curPosY = attacker.GetPosY()  | 
|       | 
|     curEffect = GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_SummonMapNPC)  | 
|     if curEffect == None:  | 
|         GameWorld.ErrLog("ûÓÐÕÒµ½ÏàÓ¦µÄЧ¹ûID %s" % ChConfig.Def_Skill_Effect_SummonMapNPC)  | 
|         return False  | 
|       | 
|     #±éÀúËùÓеÄЧ¹û ÕÒµ½ÕÙ»½µÄЧ¹û Ð§¹û1ֵΪNPCID 2ֵΪ´æÔÚʱ¼ä aiÀàÐÍÓÉNPCµÄID¾ö¶¨  | 
|     npcID = curEffect.GetEffectValue(0)  | 
|       | 
|     curNPC = GameWorld.GetGameData().FindNPCDataByID(npcID)  | 
|     if curNPC == None:  | 
|         GameWorld.ErrLog("ûÓÐNPC %s" % npcID)  | 
|         return False  | 
|       | 
|     aiType = curNPC.GetAIType()  | 
|     if aiType <= 0:  | 
|         GameWorld.ErrLog("AIÀàÐͲ»¶Ô %s" % aiType)  | 
|         return False  | 
|           | 
|     lastTime = curSkill.GetLastTime()  | 
|     #ÕÙÔÚ×Ô¼ºÉí±ßÖ÷ÒªÓÃÓÚ NPC×Ô¼ºËÀµÄʱºòÕÙ³öÁíÒ»¸ö  | 
|     #GameWorld.Log('summon map NPC: '+str([i, npcId, aiType, lastTime]))  | 
|     curNpc = NPCCommon.SummonMapNpc(npcID, curPosX, curPosY, aiType, lastTime)  | 
|       | 
|     curNpc.SetIsNeedProcess(True)  | 
|       | 
|     return True  | 
|   | 
|   | 
| ## ÕÙ»½NPC´æÔÚ¹æÔò  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param summonNPCID ÕÙ»½NPCID  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def SummonNPCOccurRule(curPlayer, summonNPCID, tick):  | 
|     #»ñµÃÍæ¼ÒÕÙ»½ÊÞÊýÁ¿  | 
|     summonCount = curPlayer.GetSummonCount()  | 
|     if summonCount == 0 :  | 
|         return True  | 
|       | 
|     curSummon = GameWorld.GetGameData().FindNPCDataByID(summonNPCID)  | 
|     if curSummon == None :  | 
|         GameWorld.Log("¼¼ÄÜÌî±í´íÎó,ÎÞ´ËNPC,summonNPCID = %s" % (summonNPCID) , curPlayer.GetPlayerID())  | 
|         return False  | 
|       | 
|     curSummonType = curSummon.GetType()  | 
|       | 
|     summonList, maxBornIndex = __GetSummonByFuncTypeList(curPlayer, summonCount, curSummonType, tick)  | 
|       | 
|     if len(summonList) == 0:  | 
|         #ÎÞͬÀàÕÙ»½ÊÞ  | 
|         return True  | 
|       | 
|     #---2010-06-07 chenxuewei Ó¦²ß»®³Â½ð³ÉÐèÇó£ºÕÙ»½NPCÊôÓÚͬһ¸ö¹¦ÄÜÀàÐÍÔòÕÙ»½ÊýÁ¿½öÒ»Ö»£»·ñÔò¿ÉÒÔͬʱ´æÔÚ£»---  | 
|     curSummonFunctionType = curSummon.GetFunctionType()  | 
|       | 
|     for summonNPC in summonList:  | 
|         if summonNPC.GetFunctionType() == curSummonFunctionType :  | 
|             npcControl = NPCCommon.NPCControl(summonNPC)  | 
|             npcControl.SetKilled()  | 
|             #GameWorld.Log("´æÔÚÏàͬµÄÁé,½«ÔÏÈÏàͬÁéɾ³ý")  | 
|             return False  | 
|           | 
|     return True  | 
|   | 
| ## »ñµÃÒÑÕÙ»½µÄͬÀàÐÍNPC  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param summonCount ÕÙ»½ÊÞÊýÁ¿   | 
| #  @param curSummonType µ±Ç°ÕÙ»½ÊÞÀàÐÍ   | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return summonNPClist , maxBornIndex Í¬ÀàÕÙ»½ÊÞ  | 
| def __GetSummonByFuncTypeList(curPlayer, summonCount, curSummonType, tick):  | 
|     #»º´æµÄͬÀàÕÙ»½ÊÞºÍË÷Òý  | 
|     summonNPCList = []  | 
|     list_Index = 0  | 
|     #»º´æ×î´ó´æÔÚʱ¼ä,ºÍÁбíË÷Òý  | 
|     maxBornTime = 0  | 
|     maxBornIndex = 0  | 
|       | 
|     for i in range(0, summonCount):  | 
|         summonNPC = curPlayer.GetSummonNPCAt(i)  | 
|           | 
|         if summonNPC.GetType() != curSummonType:  | 
|             continue  | 
|           | 
|         #ÊÇϵͳÕÙ»½ÊÞ  | 
|         #if __IsSystemSummonNPC(summonNPC):  | 
|         #    continue  | 
|           | 
|         #ÕÒµ½Í¬ÀàµÄÕÙ»½ÊÞ  | 
|         summonNPCList.append(summonNPC)  | 
|           | 
|         #µ±Ç°NPCÒѾ´æÔÚµÄʱ¼ä  | 
|         summonNPC_BeingTime = tick - summonNPC.GetBornTime()  | 
|           | 
|         #Óиü¾Ã´æÔÚµÄNPC  | 
|         if summonNPC_BeingTime > maxBornTime:  | 
|             maxBornTime = summonNPC_BeingTime  | 
|             maxBornIndex = list_Index  | 
|           | 
|         #½«±£´æÕÙ»½ÊÞµÄÁбíÊýÁ¿+1  | 
|         list_Index += 1  | 
|           | 
|     return summonNPCList, maxBornIndex  | 
|   | 
| ## »ñµÃ³ÖÐøÐÔ¼¼ÄܵÄ×ÜÁ¿(¼¼ÄÜÀàÐÍ -> 12,13)   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curSkill µ±Ç°¼¼ÄÜ  | 
| #  @param skillPlus ,¼¼ÄÜÔöÒæ  | 
| #  @return value  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def GetLastSkillMaxValue(curPlayer , curSkill , skillPlus=None):  | 
|     #¸ù¾ÝÔ¼¶¨,×ÜÁ¿Ò»¶¨ÊǵÚ0¸öЧ¹û  | 
|     curEffect = curSkill.GetEffect(0)  | 
|     index = curEffect.GetEffectValue(0)  | 
|     skillPer = curEffect.GetEffectValue(1)  | 
|     effect = curEffect.GetEffectValue(2)  | 
|     maxValue = EffGetSet.GetValueByEffIndex(curPlayer, index)  | 
|     #GameWorld.Log("³ÖÐøÉ˺¦×ÜÖµÉèÖÃcurSkill = %s,maxValue = %s skillPer = %s,effect = %s"%(curSkill.GetSkillName(),maxValue,skillPer,effect))  | 
|     if maxValue == None:  | 
|         GameWorld.Log("¼ÆË㸽¼Ó¼¼ÄÜ×ÜÁ¿´íÎó,skillID = %s,index = %s" % (curSkill.GetSkillID(), index) , curPlayer.GetPlayerID())  | 
|         return effect  | 
|       | 
|     #×ÜÖµ  | 
|     value = 0  | 
|     if skillPlus == None :  | 
|         value = (maxValue * skillPer / ChConfig.Def_MaxRateValue) + effect  | 
|         #GameWorld.Log("³ÖÐøÉ˺¦×ÜÖµÉèÖàvalue = %s"%value)  | 
|     else:  | 
|         plus = 1 + skillPlus / float(ChConfig.Def_MaxRateValue)   | 
|         value = (maxValue * (skillPer * plus) / ChConfig.Def_MaxRateValue) + effect  | 
|         #GameWorld.Log("³ÖÐøÉ˺¦×ÜÖµÉèÖàvalue = %s ¼¼Äܸ½¼Ó = %s"%(value,plus))  | 
|       | 
|     return int(value)  | 
|      | 
| ## Íæ¼ÒÕÙ»½NPC(µ±Ç°Íæ¼Ò,ÕÙ»½¼¼ÄÜ,ÕÙ»½ÊÞID,ÕÙ»½ÊÞÊôÐÔÁбí, ÕÙ»½ÊÞÀë×Ô¼ºµÄ¾àÀë, µ±Ç°Ê±¼ä)  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curSkill ÕÙ»½¼¼ÄÜ  | 
| #  @param summonID ÕÙ»½ÊÞID  | 
| #  @param summonDist ÕÙ»½ÊÞÀë×Ô¼ºµÄ¾àÀë  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @param isAppointBornPos ÊÇ·ñÖ¸¶¨ÕÙ»½NPCµÄ³öÉúµã  | 
| #  @param bornPosX ÕÙ»½NPCµÄ³öÉúµã×ø±êX  | 
| #  @param bornPosY ÕÙ»½NPCµÄ³öÉúµã×ø±êY  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def PlayerSummonNPC(curPlayer, curSkill, summonID, summonDist, tick, isAppointBornPos=False, bornPosX=0, bornPosY=0):  | 
|       | 
|     #½«ÒªÕÙ»½³öµÄNPC  | 
|     summonNPC = curPlayer.SummonNewNPC()  | 
|       | 
|     #ÉèÖÃÕÙ»½ÊÞ»ù´¡ÐÅÏ¢  | 
|     summonNPC.SetNPCTypeID(summonID)  | 
|     lvSummonNPC = curPlayer.GetLV()  | 
|     summonNPC.SetLV(lvSummonNPC)  | 
|     summonNPC.SetCountry(curPlayer.GetCountry())  | 
|     summonNPC.SetDict(ChConfig.Def_NpcDictKey_CampType, curPlayer.GetFaction())  | 
|     summonNPC.GetNPCAngry().Init(ChConfig.Def_SummonNPC_Angry_Count)  | 
|     #ÉèÖÃÕÙ»½ÊÞÊôÐÔ  | 
|     SetSummonNPCProperty(curPlayer, summonNPC, curSkill)  | 
|     #³õʼ»¯  | 
|     NPCCommon.InitNPC(summonNPC)   | 
|         | 
|     #Íæ¼ÒÕÙ»½ÊÞÁбíÌí¼ÓÕÙ»½ÊÞ,ÕÙ»½ÊÞÌí¼ÓÖ÷ÈË  | 
|     summonNPC.SetOwner(curPlayer)  | 
|     summonNPC.SetDict(ChConfig.Def_NPC_Dict_SummonMapNPCPlayerID, curPlayer.GetPlayerID())  | 
|       | 
|     #½«ÕÙ»½ÊÞÕÙ»½³öÀ´  | 
|     if isAppointBornPos:  | 
|         #Ö¸¶¨³öÉúµã  | 
|         summonNPC.Reborn(bornPosX, bornPosY)  | 
|     else:  | 
|         #Íæ¼ÒÖÜÎ§Ëæ»ú³öÉúµã  | 
|         #¼¼ÄÜÕÙ»½×ø±ê ChConfig.Def_SummonAppearDist  | 
|         summonPos = GameMap.GetEmptyPlaceInArea(curPlayer.GetPosX(), curPlayer.GetPosY(), summonDist)  | 
|         summonNPC.Reborn(summonPos.GetPosX(), summonPos.GetPosY())  | 
|     summonNPC.SetBornTime(tick)  | 
|     if curSkill:  | 
|         summonNPC.SetLastTime(curSkill.GetLastTime())  | 
|     #----ÉèÖÃΪÎÞµÐ,ÔÚAIÖнâ³ýÎ޵Р | 
|     #----Õâ¸öÂß¼ÔÚÓÐÖ÷¶¯Î޵м¼ÄÜ»òbuffµÄʱºò»á³ö´í!  | 
|     summonNPC.SetCanAttack(False)  | 
|       | 
|     return   | 
|   | 
| ## ÉèÖÃÕÙ»½ÊÞÊôÐÔ  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param summonNPC µ±Ç°ÕÙ»½ÊÞ  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def SetSummonNPCProperty(curPlayer, summonNPC, curSkill=None):  | 
|       | 
|     # Èç¹ûÊÇÒÔÕÙ»½¼¼Äܾö¶¨ÕÙ»½ÊÞÊôÐÔ°Ù·Ö±ÈµÄ  | 
|     if curSkill:  | 
|         Calc_Summon_BaseEffectBySkillPer(curPlayer, summonNPC, curSkill)  | 
|         return  | 
|       | 
| #    #ͬһ¸öÕÙ»½ÊÞÓÐ10¸öµÈ¼¶, ËùÒÔ±ØÐëÓÃGetFunctionTypeÀ´¾ö¶¨ÕÙ»½ÊÞµÄÀàÐÍ  | 
| #    summonID = summonNPC.GetFunctionType()  | 
| #      | 
| #    summonList = None  | 
| #    if ChConfig.Def_SummonProperty.has_key(summonID):  | 
| #        summonList = ChConfig.Def_SummonProperty[summonID]  | 
| #      | 
| #    #ÉèÖÃÍæ¼Ò±»¶¯¼¼ÄܶÔÕÙ»½ÊÞÊôÐÔµÄÓ°Ïì  | 
| #    __PassiveSkill_AddSummonAttribute(curPlayer, summonNPC, summonID)  | 
| #      | 
| #    if summonList != None:  | 
| #        lvSummonNPC = summonNPC.GetLV()  | 
| #        #ÉèÖÃÕÙ»½ÊÞÕ½¶·ÐÅÏ¢  | 
| #        __CalcSummonEffectValue(lvSummonNPC, summonNPC, summonList)      | 
|       | 
|     #¼ÆËã»ù´¡×ÜÖµ  | 
|     Calc_Summon_BaseEffect(summonNPC)  | 
|     return  | 
|   | 
| ## NPCʹÓü¼ÄÜÕÙ»½NPC£¬ÓÃÓÚÍâ²ãÑ»·ÕÙ»½£¬ÐèÒªÉèÖÃÕÙ»½ÊÞÊôÐÔ  | 
| #  @param curNPC µ±Ç°npc  | 
| #  @param curSkill µ±Ç°¼¼ÄÜ  | 
| #  @param summonCount ÕÙ»½ÊýÁ¿  | 
| #  @param maxAngryCount ×î´óÅÖµ  | 
| #  @param summonNPCID ÕÙ»½ÊÞID  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @param addAngry ÊÇ·ñÔö¼ÓÅÖµ  | 
| #  @return ÕÙ»½ÊÞʵÀý  | 
| def DoLogic_NPC_UseSkill_SummonNPCSingle(curNPC, curSkill, summonCount, maxAngryCount,  | 
|                                          summonNPCID, tick, addAngry=False):  | 
|   | 
|     count = 0    # ¼ÆËãÒÑÕÙ»½¸öÊý  | 
|     isAddCount = True    # ÊÇ·ñÐÂÔöÕÙ»½ÊýÁ¿  | 
|     index = -1    # ÕÙ»½ÊÞË÷Òý  | 
|   | 
|     #ѰÕÒÒ»¸ö¿ÉÒÔÕÙ»½µÄNPC  | 
|     for i in range(0, curNPC.GetSummonCount()):  | 
|         summonNPC = curNPC.GetSummonNPCAt(i)  | 
|           | 
|         if not summonNPC:  | 
|             continue  | 
|           | 
|         if summonNPC.GetNPCID() != summonNPCID:  | 
|             continue  | 
|           | 
|         if count >= summonCount:  | 
|             #×ã¹»ÁËÍ˳ö  | 
|             return None  | 
|           | 
|         #ÕÙ»½ÊýÁ¿¼Ó1  | 
|         count += 1  | 
|           | 
|         #ÒÑÕÙ»½  | 
|         if GameObj.GetHP(summonNPC) > 0:  | 
|             continue  | 
|           | 
|         #ÉèÖÃΪ²»ÐÂÔö  | 
|         isAddCount = False  | 
|         index = i  | 
|       | 
|     if isAddCount:  | 
|         #Ìí¼ÓÕÙ»½ÊýÁ¿1Ö»  | 
|         curNPC.AddSummonCount(1, summonNPCID, maxAngryCount)  | 
|         #È¡ÐÂÔöµÄÒ»Ö»£¬×îºóÒ»¸ö  | 
|         index = curNPC.GetSummonCount() - 1  | 
|       | 
|     npcID = curNPC.GetNPCID()  | 
|     skillID = curSkill.GetSkillID()  | 
|       | 
|     if index == -1:  | 
|         GameWorld.ErrLog("AddSummonErr NPCID=%s£¬ skillID=%s summonID=%s" % (npcID, skillID, summonNPCID))  | 
|         return None  | 
|       | 
|     summonNPC = curNPC.GetSummonNPCAt(index)  | 
|     if not summonNPC:  | 
|         GameWorld.ErrLog("SummonErr NPCID=%s£¬ skillID=%s summonID=%s" % (npcID, skillID, summonNPCID))  | 
|         return None  | 
|           | 
|     return SummonNPCByInstance(curNPC, summonNPC, curSkill, tick, addAngry)  | 
|   | 
| #===============================================================================  | 
| # NPC ÕÙ»½½Ó¿Ú˵Ã÷  | 
| # AddSummonCount(*args)    Ìí¼ÓNPCµÄÕÙ»½¸öÊý£¬¿ÉÖ¸¶¨NPCID  | 
| # SetSummonCount(*args)    ÉèÖÃNPCµÄÕÙ»½¸öÊý£¬¿ÉÖ¸¶¨NPCID£¬»áÇå¿ÕÒÑÓеÄÕÙ»½ÐÅÏ¢  | 
| # GetSummonCount(*args)    »ñµÃÕÙ»½×ÜÊýÁ¿  | 
| # GetSummonNPCAt(*args)    »ñµÃÖ¸¶¨Ë÷ÒýµÄÕÙ»½ÊÞ  | 
| # FindSummonByID(*args)    Í¨¹ýÖ¸¶¨µÄµØÍ¼ÖеÄNPCID£¨·ÇÊý¾Ý¿âNPCID£©²éÕÒÖ÷ÈË£¨NPC£©µÄÕÙ»½ÊÞ  | 
| #  | 
| # ÕÙ»½ÊÞËÀÍö»á´ÓÖ÷È˵ÄÕÙ»½´æ´¢ÌåÖÐÇå³ý GetSummonCountÊýÁ¿¼õÒ»  | 
| # Î´ÕÙ»½µÄÕÙ»½ÊÞ£¬³õʼHPΪ0  | 
| #===============================================================================  | 
|   | 
|   | 
| ##ͨ¹ýÊý¾Ý¿âµÄNPCID»ñµÃNPCµÄÕÙ»½ÊÞ¸öÊý£¨°üÀ¨ÒÑÕÙºÍδÕÙ£©  | 
| # @param curNPC NPCʵÀý  | 
| # @param summonID ÕÙ»½ÊÞµÄNPCID  | 
| # @return ÕÙ»½ÊÞÊýÁ¿  | 
| def GetSummonCountByNPCID(curNPC, summonID):  | 
|     count = 0  | 
|     for i in range(0, curNPC.GetSummonCount()):  | 
|         summonNPC = curNPC.GetSummonNPCAt(i)  | 
|           | 
|         if not summonNPC:  | 
|             continue  | 
|           | 
|         if summonNPC.GetNPCID() == summonID:  | 
|             count += 1  | 
|               | 
|     return count  | 
|   | 
| ## NPCʹÓü¼ÄÜÕÙ»½NPC(¿ÉÓÃÓÚÕÙ»½²»Í¬IDµÄÕÙ»½ÊÞ),Ò»´ÎÕÙÍê  | 
| #  @param curNPC µ±Ç°npc  | 
| #  @param curSkill µ±Ç°¼¼ÄÜ  | 
| #  @param summonNPCID ÕÙ»½ÊÞID  | 
| #  @param summonCount ÕÙ»½ÊýÁ¿  | 
| #  @param maxAngryCount ³ðºÞ¸öÊý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @param addAngry ÊÇ·ñÔö¼ÓÅÖµ  | 
| #  @return None  | 
| def DoLogic_NPC_UseSkill_SummonNPCAll(curNPC, curSkill, summonNPCID, summonCount,  | 
|                                      maxAngryCount, tick, addAngry=False):  | 
|     #»ñµÃ»¹ÐèÌí¼ÓµÄÕÙ»½¸öÊý  | 
|     addCount = max(summonCount - GetSummonCountByNPCID(curNPC, summonNPCID), 0)  | 
|       | 
|     #ÐÂÔöÕÙ»½ÊÞ ÕÒ²»µ½ÔòÌí¼Ó  | 
|     if addCount != 0:  | 
|         curNPC.AddSummonCount(addCount, summonNPCID, maxAngryCount)  | 
|       | 
|     count = 0  | 
|   | 
|     #ѰÕÒÒ»¸ö¿ÉÒÔÕÙ»½µÄNPC  | 
|     for i in range(0, curNPC.GetSummonCount()):  | 
|         summonNPC = curNPC.GetSummonNPCAt(i)  | 
|           | 
|         if not summonNPC:  | 
|             continue  | 
|           | 
|         if summonNPC.GetNPCID() != summonNPCID:  | 
|             continue  | 
|           | 
|         #×ã¹»ÁËÍ˳ö  | 
|         if count >= summonCount:  | 
|             return  | 
|           | 
|         #ÕÙ»½ÊýÁ¿¼Ó1  | 
|         count += 1  | 
|           | 
|         #ÒÑÕÙ»½  | 
|         if GameObj.GetHP(summonNPC) > 0:  | 
|             continue  | 
|           | 
|         SummonNPCByInstance(curNPC, summonNPC, curSkill, tick, addAngry)  | 
|       | 
|       | 
| ## NPCʹÓü¼ÄÜÕÙ»½NPC(¿ÉÓÃÓÚÕÙ»½²»Í¬IDµÄÕÙ»½ÊÞ)(µ¥´ÎÕÙ»½)  | 
| #  @param curNPC µ±Ç°npc  | 
| #  @param curSkill µ±Ç°¼¼ÄÜ  | 
| #  @param summonNPCID ÕÙ»½ÊÞID  | 
| #  @param summonAllCount ÕÙ»½×ÜÊýÁ¿  | 
| #  @param maxAngryCount ³ðºÞ¸öÊý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @param addAngry ÊÇ·ñÔö¼ÓÅÖµ  | 
| #  @param posX ÕÙ»½ÊÞ³õÊ¼×ø±ê  | 
| #  @param posY ÕÙ»½ÊÞ³õÊ¼×ø±ê  | 
| #  @return None  | 
| def DoLogic_NPC_UseSkill_SummonNPC(curNPC, curSkill, summonNPCID, summonAllCount,  | 
|                                      maxAngryCount, tick, addAngry=False,  | 
|                                      dist=ChConfig.Def_DropItemDist, rebornPosX=0, rebornPosY=0):  | 
|       | 
|     if GetSummonCountByNPCID(curNPC, summonNPCID) >= summonAllCount:  | 
|         #ÒѾ´ïµ½×ÜÊýÁ¿  | 
|         return  | 
|       | 
|     #»ñµÃ»¹ÐèÌí¼ÓµÄÕÙ»½¸öÊý  | 
|     addCount = min(summonAllCount - GetSummonCountByNPCID(curNPC, summonNPCID), 1)  | 
|       | 
|     #ÐÂÔöÕÙ»½ÊÞ ÕÒ²»µ½ÔòÌí¼Ó  | 
|     if addCount != 0:  | 
|         curNPC.AddSummonCount(addCount, summonNPCID, maxAngryCount)  | 
|   | 
|     for i in range(0, curNPC.GetSummonCount()):  | 
|         summonNPC = curNPC.GetSummonNPCAt(i)  | 
|           | 
|         if not summonNPC:  | 
|             continue  | 
|           | 
|         if summonNPC.GetNPCID() != summonNPCID:  | 
|             continue  | 
|           | 
|         #ÒÑÕÙ»½  | 
|         if GameObj.GetHP(summonNPC) > 0:  | 
|             continue  | 
|           | 
|         return SummonNPCByInstance(curNPC, summonNPC, curSkill, tick, addAngry, dist, rebornPosX, rebornPosY)  | 
|       | 
|     return  | 
|   | 
|       | 
| ## NPCʹÓü¼ÄÜÕÙ»½NPC(¿ÉÓÃÓÚÕÙ»½²»Í¬IDµÄÕÙ»½ÊÞ),Ò»´ÎÕÙÍê  | 
| #  @param curNPC µ±Ç°npc  | 
| #  @param summonNPC ÕÙ»½ÊÞʵÀý  | 
| #  @param curSkill µ±Ç°¼¼ÄÜ  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @param addAngry ÊÇ·ñÔö¼ÓÅÖµ  | 
| #  @param dist ÕÙ»½·¶Î§  | 
| #  @return ÕÙ»½ÊÞʵÀý  | 
| def SummonNPCByInstance(curNPC, summonNPC, curSkill, tick, addAngry=False, dist=ChConfig.Def_DropItemDist,  | 
|                         posX=0, posY=0):  | 
|       | 
|     #ÉèÖÃÕâ¸öNPCÊôÐÔ£¬²¢ÕÙ»½³öÕâ¸öNPC  | 
|     NPCCommon.InitNPC(summonNPC)  | 
|       | 
|     # ÊôÐÔ±ä¸üºó֪ͨ³öÏÖ  | 
|     if posX != 0 and posY != 0:  | 
|         summonNPC.Reborn(posX, posY, False)  | 
|     else:  | 
|         resultPos = GameMap.GetEmptyPlaceInArea(curNPC.GetPosX(), curNPC.GetPosY(), dist)  | 
|         summonNPC.Reborn(resultPos.GetPosX() , resultPos.GetPosY(), False)  | 
|       | 
|     summonNPC.SetBornTime(tick)  | 
|     summonNPC.SetLastTime(curSkill.GetLastTime())  | 
|       | 
|     summonNPC.SetIsNeedProcess(True)  | 
|       | 
|     atkper = 1  | 
|     findEffect = GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_SummonAttr)  | 
|   | 
|     if findEffect:  | 
|         atkper = float(findEffect.GetEffectValue(0))/ChConfig.Def_MaxRateValue  | 
|         maxHPPer = float(findEffect.GetEffectValue(2))/ChConfig.Def_MaxRateValue  | 
|         if atkper:  | 
|             summonNPC.SetBaseMinAtk(int(curNPC.GetMinAtk()*atkper))  | 
|             summonNPC.SetBaseMaxAtk(int(curNPC.GetMaxAtk()*atkper))  | 
|         if maxHPPer:  | 
|             GameObj.SetMaxHP(summonNPC, int(GameObj.GetMaxHP(curNPC)*maxHPPer))  | 
|             GameObj.SetHP(summonNPC, int(GameObj.GetMaxHP(curNPC)*maxHPPer))  | 
|     else:  | 
|         NPCCommon.DoNPCAttrStrengthen(summonNPC, True)  | 
|     FBLogic.DoFBRebornSummonNPC(summonNPC, tick)  | 
|       | 
|     if not addAngry:  | 
|         #·µ»ØÖµ,¼¼ÄÜÊͷųɹ¦  | 
|         return summonNPC  | 
|       | 
|     #--------------¼Ì³ÐÕÙ»½ÕßNPCµÄ³ðºÞ  | 
|     summonNPCAngry = summonNPC.GetNPCAngry()  | 
|     curNPCAngry = curNPC.GetNPCAngry()  | 
|       | 
|     for i in range(0 , curNPCAngry.GetAngryCount()):  | 
|         angryValue = curNPCAngry.GetAngryValueTag(i)  | 
|         angryValue_ID = angryValue.GetObjID()  | 
|           | 
|         if not angryValue_ID:  | 
|             continue  | 
|           | 
|         summonNPCAngry.AddAngry(angryValue_ID, angryValue.GetObjType(), angryValue.GetAngryValue())  | 
|       | 
|     summonNPC.NotifyAppear() # ×îÖÕͳһ֪ͨNPC³öÏÖ  | 
|     #·µ»ØÖµ,¼¼ÄÜÊͷųɹ¦  | 
|     return summonNPC  | 
|   | 
|   | 
| ## ÕÙ»½ÊÞʹÓü¼ÄÜÕÙ»½  | 
| #  @param curNPC µ±Ç°NPC  | 
| #  @param curSkill µ±Ç°¼¼ÄÜ  | 
| #  @param maxSummonCount ×î´óÕÙ»½ÊýÁ¿  | 
| #  @param maxAngryCount ×î´óÅÖµÊýÁ¿  | 
| #  @param posX ÖØÉú×ø±êX  | 
| #  @param posY ÖØÉú×ø±êY  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return ÕÙ»½ÊÞ  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| #def SummonNPC_UseSkill_SummonNPC(curNPC, curSkill , maxSummonCount , maxAngryCount , posX, posY, tick):  | 
| #    #»ñµÃÕÙ»½ÊÞID  | 
| #    summonNPCID = curSkill.GetEffect(0).GetEffectValue(0)  | 
| #      | 
| #    if not summonNPCID:  | 
| #        return  | 
| #      | 
| #    #µÚÒ»´ÎÕÙ»½µÄʱºò£¬ÐèÒª³õʼ»¯×î´óÕÙ»½¸öÊý  | 
| #    if not curNPC.GetSummonCount() :  | 
| #        curNPC.SetSummonCount(maxSummonCount, summonNPCID, maxAngryCount)  | 
| #      | 
| #    #ÕÙ»½ÊÞÕÙ»½²¹×ã  | 
| #    elif curNPC.GetGameNPCObjType() == IPY_GameWorld.gnotSummon and maxSummonCount > curNPC.GetSummonCount():  | 
| #        curNPC.AddSummonCount(maxSummonCount - curNPC.GetSummonCount(), summonNPCID, maxAngryCount)  | 
| #      | 
| #    #ѰÕÒÒ»¸ö¿ÉÒÔÕÙ»½µÄNPC  | 
| #    summonIsFull = True  | 
| #    summonNPC = None  | 
| #      | 
| #    for i in range(0, curNPC.GetSummonCount()):  | 
| #        summonNPC = curNPC.GetSummonNPCAt(i)  | 
| #        if summonNPC.GetHP() > 0:  | 
| #            continue  | 
| #          | 
| #        summonIsFull = False  | 
| #        break  | 
| #      | 
| #    #ÒѾûÓпÉÕÙ»½ÊÞµÄÕÙ»½ÊÞ,ÂúÁË  | 
| #    if summonIsFull:  | 
| #        return  | 
| #      | 
| #    #ÉèÖÃÕâ¸öNPCÊôÐÔ£¬²¢ÕÙ»½³öÕâ¸öNPC  | 
| #    NPCCommon.InitNPC(summonNPC)  | 
| #  | 
| #    summonNPC.Reborn(posX , posY)  | 
| #    summonNPC.SetBornTime(tick)  | 
| #    summonNPC.SetLastTime(curSkill.GetLastTime())  | 
| #      | 
| #    #·µ»ØsummonNPC,¼¼ÄÜÊͷųɹ¦  | 
| #    return summonNPC  | 
|   | 
| ## ÉèÖÃÍæ¼Ò±»¶¯¼¼ÄܶÔÕÙ»½ÊÞÊôÐÔµÄÓ°Ïì  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param summonNPC µ±Ç°ÕÙ»½ÊÞ  | 
| #  @param summonID ÕÙ»½ÊÞID  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def __PassiveSkill_AddSummonAttribute(curPlayer, summonNPC, summonID):  | 
|     return  | 
|   | 
| ## ¸ù¾ÝЧ¹û»ñµÃÖµ  | 
| #  @param valueList   | 
| #  @param curSkill µ±Ç°¼¼ÄÜ  | 
| #  @return Ð§¹ûÖµÐòÁÐ  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def GetValueBySkillEffect(valueList, curSkill):  | 
|     effCount = len(valueList)  | 
|     returnList = []  | 
|     for index in range(0 , effCount) :  | 
|         effValue = curSkill.GetEffect(index).GetEffectValue(0)  | 
|         value = valueList[index] * effValue / ChConfig.Def_MaxRateValue   | 
|         returnList.append(value)  | 
|           | 
|     return returnList   | 
|       | 
| ## ¼ÆËãNPCÊôÐÔЧ¹û   | 
| #  @param lvSummonNPC Íæ¼Ò  | 
| #  @param summonNPC Ð§¹û  | 
| #  @param summonList NPC  | 
| #  @return True  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def __CalcSummonEffectValue(lvSummonNPC, summonNPC, summonList):  | 
|     for value in summonList:  | 
|         curValue = EffGetSet.GetValueByEffIndex(summonNPC, value[0])  | 
|         #GameWorld.Log("µ±ÆÚÊôÐÔ = %s index = %s"%(curValue,value[0]))  | 
|         #GameWorld.Log("ÉèÖÃÊôÐÔ = %s"%(curValue + value[1] * lvSummonNPC))  | 
|         EffGetSet.SetValueByEffIndex(summonNPC, value[0], curValue + value[1] * lvSummonNPC)  | 
|           | 
|     return True  | 
|   | 
| ## ÉèÖÃÕâ¸öÕÙ»½Ê޵Ļù´¡ÊôÐÔ  | 
| #  @param summonNPC ÕÙ»½ÊÞ  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def Calc_Summon_BaseEffectBySkillPer(curPlayer, summonNPC, curSkill):  | 
|     curEffect = curSkill.GetEffect(0)  | 
|     if curEffect == None:  | 
|         GameWorld.Log("ÕÙ»½¼¼ÄÜÎÞЧ¹û,skillID = %s" % curSkill.GetSkillID(), curPlayer.GetPlayerID())  | 
|         return False  | 
|       | 
|     skillPer = curEffect.GetEffectValue(1)  | 
|     if not skillPer:  | 
|         GameWorld.Log("¼¼ÄÜ %sÌî±í´íÎó,ÕÙ»½¼¼ÄÜÊôÐÔ°Ù·Ö±ÈΪ0" % curSkill.GetSkillID(), curPlayer.GetPlayerID())  | 
|         return False  | 
|   | 
|     skillPer = skillPer / float(ChConfig.Def_MaxRateValue)  | 
|   | 
|   | 
|     #ÉèÖÃÕâ¸öÕÙ»½Ê޵Ļù´¡ÊôÐÔ  | 
|     summonNPC.SetBaseMinAtk(int(curPlayer.GetMinAtk() * skillPer))     #×îС¹¥»÷Á¦  | 
|     summonNPC.SetBaseMaxAtk(int(curPlayer.GetMaxAtk() * skillPer))                      #×î´ó¹¥»÷Á¦  | 
|     summonNPC.SetBaseDef(int(curPlayer.GetDef() * skillPer))                            #·ÀÓùÁ¦  | 
|     summonNPC.SetBaseHit(int(curPlayer.GetHit() * skillPer))                            #ÃüÖÐ  | 
|       | 
|     summonNPC.SetBasePoisionAtk(int(curPlayer.GetPoisionAtk() * skillPer))            | 
|     summonNPC.SetBaseFireAtk(int(curPlayer.GetFireAtk() * skillPer))  | 
|     summonNPC.SetBaseIceAtk(int(curPlayer.GetIceAtk() * skillPer))  | 
|     summonNPC.SetBaseThunderAtk(int(curPlayer.GetThunderAtk() * skillPer))  | 
|     summonNPC.SetBaseWindAtk(int(curPlayer.GetWindAtk() * skillPer))  | 
|       | 
|     summonNPC.SetBasePoisionDef(int(curPlayer.GetPoisionDef() * skillPer))  | 
|     summonNPC.SetBaseFireDef(int(curPlayer.GetFireDef() * skillPer))  | 
|     summonNPC.SetBaseIceDef(int(curPlayer.GetIceDef() * skillPer))  | 
|     summonNPC.SetBaseThunderDef(int(curPlayer.GetThunderDef() * skillPer))  | 
|     summonNPC.SetBaseWindDef(int(curPlayer.GetWindDef() * skillPer))  | 
|       | 
|     #summonNPC.SetBaseAtkInterval(int(curPlayer.GetAtkInterval() * skillPer))  | 
|     summonNPC.SetBaseMissRate(int(curPlayer.GetMiss() * skillPer))  | 
|     summonNPC.SetBaseSuperHiteRate(int(curPlayer.GetSuperHitRate() * skillPer))  | 
|     summonNPC.SetBaseMaxHP(int(curPlayer.GetMaxHP() * skillPer))  | 
|     #summonNPC.SetBaseHPRestore(int(curPlayer.GetHPRestoreSetting() * skillPer))  | 
|     #summonNPC.SetOrgSpeed(int(curPlayer.GetOrgSpeed() * skillPer))  | 
|     return  | 
|   | 
| ## ÉèÖÃÕâ¸öÕÙ»½Ê޵Ļù´¡ÊôÐÔ  | 
| #  @param summonNPC ÕÙ»½ÊÞ  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def Calc_Summon_BaseEffect(summonNPC):  | 
|     #ÉèÖÃÕâ¸öÕÙ»½Ê޵Ļù´¡ÊôÐÔ  | 
|     summonNPC.SetBaseMinAtk(summonNPC.GetMinAtk())                      #×îС¹¥»÷Á¦  | 
|     summonNPC.SetBaseMaxAtk(summonNPC.GetMaxAtk())                      #×î´ó¹¥»÷Á¦  | 
|     summonNPC.SetBaseDef(summonNPC.GetDef())                            #·ÀÓùÁ¦  | 
|     summonNPC.SetBaseHit(summonNPC.GetHit())                            #ÃüÖÐ  | 
|       | 
|     summonNPC.SetBasePoisionAtk(summonNPC.GetPoisionAtk())            | 
|     summonNPC.SetBaseFireAtk(summonNPC.GetFireAtk())  | 
|     summonNPC.SetBaseIceAtk(summonNPC.GetIceAtk())  | 
|     summonNPC.SetBaseThunderAtk(summonNPC.GetThunderAtk())  | 
|     summonNPC.SetBaseWindAtk(summonNPC.GetWindAtk())  | 
|       | 
|     summonNPC.SetBasePoisionDef(summonNPC.GetPoisionDef())  | 
|     summonNPC.SetBaseFireDef(summonNPC.GetFireDef())  | 
|     summonNPC.SetBaseIceDef(summonNPC.GetIceDef())  | 
|     summonNPC.SetBaseThunderDef(summonNPC.GetThunderDef())  | 
|     summonNPC.SetBaseWindDef(summonNPC.GetWindDef())  | 
|       | 
|     summonNPC.SetBaseAtkInterval(summonNPC.GetAtkInterval())  | 
|     summonNPC.SetBaseMissRate(summonNPC.GetMiss())  | 
|     summonNPC.SetBaseSuperHiteRate(summonNPC.GetSuperHitRate())  | 
|     summonNPC.SetBaseMaxHP(summonNPC.GetMaxHP())  | 
|     summonNPC.SetBaseHPRestore(summonNPC.GetHPRestore())  | 
|     #summonNPC.SetOrgSpeed( summonNPC.GetOrgSpeed( ))  | 
|     return  | 
|   | 
| #-----------------------------------------NPCÀà  | 
| ## »ñµÃȺ¹¥¼¼ÄÜ,¹¥»÷·¶Î§ÄڵĶÓÎé³ÉÔ±   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param srcPosX ÆðµãX  | 
| #  @param srcPosY ÆðµãY  | 
| #  @param skillMatrix ¼¼Äܹ¥»÷Êý×é  | 
| #  @param area ×é¶ÓÇøÓò  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def GetSkillAreaTeamPlayer(curPlayer, srcPosX, srcPosY, skillMatrix, area):  | 
|     gameMap = GameWorld.GetMap()  | 
|     curPlayerTeam = curPlayer.GetTeam()  | 
|     #»ñµÃÖ¸¶¨·¶Î§ÄÚ¶ÓÎé³ÉÔ±  | 
|     teamPlayerList = PlayerControl.GetAreaTeamMember(curPlayerTeam, srcPosX, srcPosY, area)  | 
|     #½«×é¶ÓÍæ¼ÒÁбíת»»³ÉIDÁÐ±í  | 
|     teamIDList = []  | 
|     for teamPlayer in teamPlayerList:  | 
|         teamIDList.append(teamPlayer.GetID())  | 
|       | 
|     #ÔÚÇøÓòÄڵĶÓÔ±ÊýÁ¿  | 
|     inAreaTeamPlayerList = []    | 
|       | 
|     for curPos in skillMatrix:  | 
|         #¼ì²éÓÐûÓжÔÏóÔÚÕâÒ»µãÉÏ  | 
|         mapObj = gameMap.GetPosObj(srcPosX + curPos[0], srcPosY + curPos[1])  | 
|           | 
|         if not mapObj:  | 
|             continue  | 
|           | 
|         #±éÀúµ±Ç°µã¶ÔÏó  | 
|         for i in range(0, mapObj.GetObjCount()):  | 
|             curObj = mapObj.GetObjByIndex(i)  | 
|             curObjType = curObj.GetGameObjType()  | 
|             #NPC²»´¦Àí  | 
|             if curObjType != IPY_GameWorld.gotPlayer :  | 
|                 continue  | 
|               | 
|             #²»ÊÇÕÙ»½ÊÞµÄÖ÷ÈË,²¢ÇÒ²»ÊǶÓÓÑ  | 
|             curObjID = curObj.GetID()  | 
|             if curObjID != curPlayer.GetID() and \  | 
|                     curObjID not in teamIDList:  | 
|                 continue  | 
|               | 
|             #ÕÒµ½Õâ¸öÓÎÏ·¶ÔÏóʵÀý  | 
|             curObj = GameWorld.GetObj(curObjID, curObjType)  | 
|               | 
|             if curObj == None:  | 
|                 continue  | 
|               | 
|             inAreaTeamPlayerList.append(curObj)  | 
|       | 
|     return inAreaTeamPlayerList  | 
|   | 
| ## ²éÕÒÖ¸¶¨¼¼ÄܵÄЧ¹û  | 
| #  @param curPlayer Íæ¼Ò  | 
| #  @param skillType ¼¼ÄÜÀàÐÍ  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def GetSkillEff(curPlayer, skillType):  | 
|     skill = curPlayer.GetSkillManager().FindSkillBySkillTypeID(skillType)  | 
|       | 
|     if skill == None :  | 
|         return 0  | 
|       | 
|     effect = skill.GetEffect(0).GetEffectValue(0)  | 
|     return effect  | 
|       | 
| ## ¼¼Äָܻ´À¶   | 
| #  @param curObj µ±Ç°¶ÔÏó  | 
| #  @param skillTypeID ¼¼ÄÜÀàÐÍID  | 
| #  @param addValue Ìí¼ÓÖµ  | 
| #  @return None  | 
| #  @remarks ¼¼Äָܻ´À¶  | 
| def SkillAddMP(curObj, skillTypeID, addValue):  | 
| #===============================================================================  | 
| #    if addValue <= 0:  | 
| #        GameWorld.Log('###¼¼Äܻظ´Ä§·¨Òì³£,ÊýÖµ´íÎó = %s,¼¼ÄÜÀàÐÍID = %s' % (addValue , skillTypeID))  | 
| #        return  | 
| #      | 
| #    curHP = GameObj.GetHP(curObj)  | 
| #      | 
| #    #ËÀÍö¾Í²»ÈûØÀ¶ÁË  | 
| #    if curHP <= 0:  | 
| #        return  | 
| #      | 
| #    #¹ã²¥»ØÄ§  | 
| #    if skillTypeID > 0:  | 
| #        curObj.ChangeHPView(skillTypeID, addValue, ChConfig.Def_HurtTYpe_Recovery)  | 
| #      | 
| #    curMP = curObj.GetMP()  | 
| #    maxMP = curObj.GetMaxMP()  | 
| #      | 
| #    #À¶ÒÑ×î´óÖµ£¬²»ÔÙ»Ö¸´£¬Ìø³ö  | 
| #    if curMP == maxMP:  | 
| #        return  | 
| #   | 
| #    curObj.SetMP(min(curMP + addValue, maxMP))  | 
| #===============================================================================  | 
|     return  | 
|   | 
| ## ¼¼ÄÜÏûÀ¶  | 
| #  @param curObj µ±Ç°¶ÔÏó  | 
| #  @param skillTypeID ¼¼ÄÜÀàÐÍID  | 
| #  @param skillOwner buffÓµÓÐÕß  | 
| #  @param lostValue ¶ªÊ§Öµ  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @param view ÊÇ·ñ¹ã²¥  | 
| #  @param reduce ÊÇ·ñ¿ÛÀ¶  | 
| #  @return None  | 
| #  @remarks ¼¼ÄÜÏûÀ¶  | 
| def SkillLostMP(curObj, skillTypeID, skillOwner, lostValue, tick, view=True, reduce=True):  | 
|     #===========================================================================  | 
|     # if lostValue <= 0:  | 
|     #    GameWorld.Log('###¼¼ÄÜÉ˺¦ÑªÁ¿Òì³£,ÊýÖµ´íÎó = %s,¼¼ÄÜÀàÐÍID = %s' % (lostValue, skillTypeID))  | 
|     #    return  | 
|     #   | 
|     # curObjType = curObj.GetGameObjType()  | 
|     # if curObjType == IPY_GameWorld.gotNPC:  | 
|     #    return  | 
|     #   | 
|     # #´«Èë¶ÔÏóʵÀýÖ´Ðй¥»÷½á¹û  | 
|     # curObjDetel = GameWorld.GetObj(curObj.GetID(), curObjType)  | 
|     #   | 
|     # if not curObjDetel:  | 
|     #    GameWorld.ErrLog('SkillLostMP nofind ObjID = %s, ObjType = %s' % (curObj.GetID(), curObjType))  | 
|     #    return  | 
|     #   | 
|     # if view :  | 
|     #    #¹ã²¥ÉËѪÀàÐÍ  | 
|     #    curObj.ChangeHPView(skillTypeID, lostValue, ChConfig.Def_HurtType_Normal)  | 
|     #   | 
|     # curObjBeforeMP = curObj.GetMP()  | 
|     #   | 
|     # if reduce :  | 
|     #    #Ê£ÓàѪÁ¿  | 
|     #    remainMP = max(curObjBeforeMP - lostValue , 0)  | 
|     #    curObj.SetMP(remainMP)  | 
|     #   | 
|     # #ͳһµ÷Óù¥»÷½áÊø¶¯×÷  | 
|     # BaseAttack.DoLogic_AttackResult(skillOwner, curObjDetel, None, tick)  | 
|     #===========================================================================  | 
|     return  | 
|   | 
|   | 
| ## ¼¼Äָܻ´ÑªÁ¿   | 
| #  @param curObj µ±Ç°¶ÔÏó  | 
| #  @param skillTypeID ¼¼ÄÜÀàÐÍID  | 
| #  @param addValue Ìí¼ÓÖµ  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def SkillAddHP(curObj, skillTypeID, addValue, isNotify=True):  | 
|     curObjType = curObj.GetGameObjType()  | 
|       | 
|     #=======================================================================  | 
|     # if curObj.GetMapID() in ChConfig.CanNotRecoverMapIDList and skillTypeID not in ChConfig.ForceRecoverSkillList:  | 
|     #    GameWorld.DebugLog("¸ÃµØÍ¼ÎÞ·¨Ê¹Óü¼Äָܻ´ÑªÁ¿!")  | 
|     #    return  | 
|     #=======================================================================  | 
|     if GameObj.GetPyPlayerState(curObj, ChConfig.Def_PlayerState_LimitAddHP):  | 
|         #GameWorld.DebugLog("µ±Ç°½ûÁÆ×´Ì¬Ï£¬ÎÞ·¨»Ö¸´!")  | 
|         return  | 
|   | 
|       | 
|     if addValue <= 0:  | 
|         GameWorld.Log('###¼¼Äܻظ´ÑªÁ¿Òì³£,ÊýÖµ´íÎó = %s,¼¼ÄÜÀàÐÍID = %s' % (addValue , skillTypeID))  | 
|         return  | 
|       | 
|     curHP = GameObj.GetHP(curObj)  | 
|       | 
|     #ËÀÍö¾Í²»ÈûØÑªÁË  | 
|     if curHP <= 0:  | 
|         return  | 
|       | 
|     # ÖÎÁÆ¼Ó³É  | 
|     curePer = PlayerControl.GetCurePer(curObj) if curObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue   | 
|     addValue = int(addValue*curePer*1.0/ChConfig.Def_MaxRateValue)  | 
|       | 
|     maxHP = GameObj.GetMaxHP(curObj)  | 
|       | 
|     #ѪÒÑ×î´óÖµ£¬²»ÔÙ»Ö¸´£¬Ìø³ö  | 
|     if curHP == maxHP:  | 
|         #¹ã²¥¼ÓѪÀàÐÍ  | 
|         if isNotify:  | 
|             AttackCommon.ChangeHPView(curObj, curObj, skillTypeID, addValue, ChConfig.Def_HurtTYpe_Recovery)  | 
|         return  | 
|       | 
|     remainHP = min(curHP + addValue, maxHP)  | 
|       | 
|     #---Íæ¼Ò´¦Àí---  | 
|     if curObjType == IPY_GameWorld.gotPlayer:  | 
|         GameObj.SetHP(curObj, remainHP, not isNotify)  | 
|         FBLogic.OnFBAddHP(curObj, addValue)  | 
|       | 
|     #---NPC´¦Àí---  | 
|     elif curObjType == IPY_GameWorld.gotNPC:  | 
|         #³èÎï»ØÑª  | 
|         if curObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:  | 
|             PetControl.SetPetHP(curObj, remainHP)  | 
|         #ÆÕͨNPC»ØÑª  | 
|         else:  | 
|             GameObj.SetHP(curObj, remainHP)  | 
|             if not isNotify:  | 
|                 #Òѹ㲥µÄ²»Öظ´  | 
|                 curObj.Notify_HPEx()  | 
|              | 
|     #¹ã²¥¼ÓѪÀàÐÍ  | 
|     if isNotify:  | 
|         AttackCommon.ChangeHPView(curObj, curObj, skillTypeID, addValue, ChConfig.Def_HurtTYpe_Recovery)  | 
|               | 
|     return  | 
|   | 
| ## »ñÈ¡¸ç²¼ÁÖ¹¦ÄÜNPCÀàÐ͵ôѪֵ  | 
| def GetGoblinLostHP(defender, hurtValue):  | 
|     if not defender:  | 
|         return hurtValue  | 
|       | 
|     defObjType = defender.GetGameObjType()  | 
|     if defObjType == IPY_GameWorld.gotNPC:  | 
|         npcFuncType = defender.GetFunctionType()  | 
|         if npcFuncType == ChConfig.Def_NPCFuncType_Goblin:  | 
|             goblinHurtValue = int(ReadChConfig.GetEvalChConfig('GoblinHurtValue'))  | 
|             hurtValue = min(hurtValue, goblinHurtValue)  | 
|               | 
|     return hurtValue  | 
|   | 
| ## ¼¼ÄÜÉËѪ  | 
| #  @param curObj µ±Ç°¶ÔÏó  | 
| #  @param skillTypeID ¼¼ÄÜÀàÐÍID  | 
| #  @param buffOwner buffÓµÓÐÕß  | 
| #  @param lostValue ¶ªÊ§Öµ  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @param view ÊÇ·ñ¹ã²¥  | 
| #  @param reduce ÊÇ·ñ¿ÛѪ  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def SkillLostHP(curObj, skillTypeID, buffOwner, lostValue, tick, view=True, reduceHP=True,   | 
|                 isDoAttackResult=True, hurtType=ChConfig.Def_HurtType_Normal):  | 
|     if lostValue <= 0:  | 
|         GameWorld.Log('###¼¼ÄÜÉ˺¦ÑªÁ¿Òì³£,ÊýÖµ´íÎó = %s,¼¼ÄÜÀàÐÍID = %s' % (lostValue, skillTypeID))  | 
|         return  | 
|       | 
|     #lostValue = GetGoblinLostHP(curObj, lostValue)  | 
|     curObjType = curObj.GetGameObjType()  | 
|     curSkill = GameWorld.GetGameData().FindSkillByType(skillTypeID, 1)  | 
|       | 
|     # ¼¼ÄܶÔÖ¸¶¨BOSSÎÞЧ¹û-----------------  | 
|     if curObjType == IPY_GameWorld.gotNPC and curObj.GetIsBoss() not in ChConfig.Def_SkillAttack_NPCIsBoss:  | 
|         if curSkill and GetSkillBattleType(curSkill) == ChConfig.Def_BattleRelationType_CommNoBoss:  | 
|             return  | 
|       | 
|     notifyLostValue = lostValue  | 
|     curObjHP_BeforeAttack = GameObj.GetHP(curObj)  | 
|       | 
|     if reduceHP :  | 
|         # Ñª¶Ü   | 
|   | 
|         lostValue = AttackCommon.CalcBloodShield(buffOwner, curObj, lostValue)  | 
|           | 
|         #Ê£ÓàѪÁ¿  | 
|         remainHP = max(curObjHP_BeforeAttack - lostValue , 0)  | 
|           | 
|         #NPC´¦Àí  | 
|         if curObjType == IPY_GameWorld.gotNPC:  | 
|             #³èÎïÌØÊâ´¦Àí  | 
|             if curObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:  | 
|                 PetControl.SetPetHP(curObj, remainHP)  | 
|             else:  | 
|                 GameObj.SetHP(curObj, remainHP)  | 
|                 if not view :   # Òѹ㲥µÄ²»Öظ´  | 
|                     curObj.Notify_HPEx()  | 
|   | 
|         #ÆäËû¶ÔÏóÂß¼´¦Àí  | 
|         else:  | 
|             # Òѹ㲥µÄ²»Öظ´  | 
|             GameObj.SetHP(curObj, remainHP, not view)  | 
|       | 
|     if view:  | 
|         #¹ã²¥ÉËѪÀàÐÍ  | 
|         AttackCommon.ChangeHPView(curObj, buffOwner, skillTypeID, notifyLostValue, hurtType)  | 
|           | 
|     # ±ôËÀ״̬´¥·¢¼¼ÄÜ  | 
|     if GameObj.GetHP(curObj) == 0:  | 
|         PassiveBuffEffMng.OnPassiveSkillTrigger(curObj, None, curSkill, ChConfig.TriggerType_WillDead, tick)  | 
|       | 
|       | 
|     #ÎÞ·¨ÕÒµ½BuffÓµÓÐÕß  | 
|     if not buffOwner:  | 
|         AttackCommon.DoLogic_ObjDead(curObj)  | 
|         return  | 
|           | 
|     #NPCÐèÒªÊÖ¶¯Ìí¼ÓÉËѪºÍ³ðºÞ, ÒòΪÎÞµ÷ÓÃDoAttack  | 
|     if curObjType == IPY_GameWorld.gotNPC:  | 
|           | 
|         attackerOwner = None  | 
|           | 
|         #---¸ù¾ÝBUFFÖ÷ÈËÀàÐ;ö¶¨ÊÇ·ñ¸ø¹¥»÷ÕßÖ÷È˳ðºÞ---  | 
|         if buffOwner.GetGameObjType() == IPY_GameWorld.gotNPC:  | 
|             attackerOwner = NPCCommon.GetNpcObjOwnerDetail(buffOwner)  | 
|   | 
|         #Ìí¼Ó³ðºÞ  | 
|         if GameObj.GetHP(curObj) > 0:  | 
|             curNPCControl = NPCCommon.NPCControl(curObj)  | 
|             #Ìí¼Ó³ðºÞ  | 
|             curNPCControl.AddObjToAngryList(buffOwner, lostValue)  | 
|               | 
|             if attackerOwner != None:  | 
|                 #¸øÖ÷ÈËÌí¼Ó1µã³ðºÞ£¬±ÜÃâÍÑÀë״̬  | 
|                 curNPCControl.AddObjToAngryList(attackerOwner, 1)  | 
|       | 
|     # ¼ÓÉËѪ  | 
|     if buffOwner.GetGameObjType() == IPY_GameWorld.gotNPC:  | 
|         attackerOwner = NPCCommon.GetNpcObjOwnerDetail(buffOwner)  | 
|     else:  | 
|         attackerOwner = buffOwner  | 
|           | 
|     # 2013-1-3,È¥³ýnpc¹¥»÷Ôì³ÉµÄÉËѪ¼Ç¼  | 
|     if attackerOwner != None and attackerOwner.GetGameObjType() == IPY_GameWorld.gotPlayer:  | 
|         AttackCommon.NPCAddObjInHurtList(attackerOwner, curObj, curObjHP_BeforeAttack, lostValue)      | 
|         #CheckAddPoisonAtkBuff(skillTypeID, attackerOwner, curObj, tick)  | 
|           | 
|         if curObjType == IPY_GameWorld.gotPlayer:  | 
|             AttackCommon.OnPVPDamage(attackerOwner, lostValue, curObj, "SkillLostHP")  | 
|   | 
|     #ͳһµ÷Óù¥»÷½áÊø¶¯×÷  | 
|     if isDoAttackResult:  | 
|         BaseAttack.DoLogic_AttackResult(buffOwner, curObj, None, tick)  | 
|     return  | 
|   | 
| ## ¼ì²éÔö¼Ó´ã¶¾buff  | 
| #  @param skillTypeID Ê¹Óõļ¼ÄÜtypeID  | 
| #  @return ÎÞ  | 
| def CheckAddPoisonAtkBuff(skillTypeID, attacker, defObj, tick):  | 
|     attackerObjType = attacker.GetGameObjType()  | 
|     defObjType = defObj.GetGameObjType()  | 
|       | 
|     if attackerObjType != IPY_GameWorld.gotPlayer or defObjType != IPY_GameWorld.gotPlayer:  | 
|         return  | 
|       | 
|     # Óö¾ÈÐɱËÀµÄ(¶¾Èм¼Äܱ¾Éí¼°Öж¾Ð§¹û)  | 
|     if skillTypeID in [5380, 5340] and GameObj.GetHP(defObj) <= 0:  | 
|         poisionAtkBuffID = ChConfig.Def_SkillID_PoisonAtkBuff  | 
|         curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(poisionAtkBuffID)  | 
|         if curSkill:  | 
|             SkillShell.DoLogic_UseSkill(attacker, attacker, curSkill, tick)  | 
|           | 
|               | 
|     return  | 
|   | 
| ## Í¨Öª¿Í»§¶ËѪÌõ  | 
| #  @param curObj µ±Ç°ÓÎÏ·¶ÔÏó  | 
| #  @return ÎÞ  | 
| #  @remarks Í¨Öª¿Í»§¶ËѪÌõ  | 
| def NotifyNPCHP(curObj):  | 
|     #NPC´¦Àí  | 
|     if curObj.GetGameObjType() != IPY_GameWorld.gotNPC:  | 
|         return  | 
|       | 
|     #³èÎïÌØÊâ´¦Àí  | 
|     if curObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:  | 
|         pass  | 
|         #curObj.Sync_RefreshProp(IPY_GameWorld.PetInfoRefresh_HP, curObj.GetHP(), True)  | 
|     else:  | 
|         curObj.Notify_HPEx()  | 
|   | 
|   | 
| ## »ñµÃ¼¼ÄÜbuffµÄÓµÓÐÕß  | 
| #  @param buff   | 
| #  @return Obj  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def GetBuffOwner(buff):  | 
|     buffOwnerID = buff.GetOwnerID()  | 
|     buffOwnerType = buff.GetOwnerType()  | 
|       | 
|     if buffOwnerID == 0 or buffOwnerType == 0:  | 
|         #GameWorld.Log("-------²éÕÒ³ÖÐøbuffID´íÎó buffOwnerID = %s ,buffOwnerType = %s"%(buffOwnerID, buffOwnerType))  | 
|         return  | 
|       | 
|     return GameWorld.GetObj(buffOwnerID, buffOwnerType)  | 
|       | 
| ## »ñµÃ³ÖÐøÐÍbuffµÄµ¥´ÎѪÁ¿±ä»¯  | 
| #  @param curBuff µ±Ç°buff  | 
| #  @param refuTime Ë¢Ð¼ä¸ô  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return lostValue  | 
| #  @remarks »ñµÃ³ÖÐøÐÍbuffµÄµ¥´ÎѪÁ¿±ä»¯ £¨¼Ó/¼õѪ£©  | 
| def GetProcessBuffChangeHp_Time(curBuff, refuTime, tick):  | 
|     #Ê£Óà¸Ä±äÖµ  | 
|     value = curBuff.GetValue()  | 
|     #Ê£Óàʱ¼ä  | 
|     remainTime = curBuff.GetRemainTime()  | 
|     #»¹Äܹ»³ÖÐøµÄ´ÎÊý  | 
|     lostTime = GameWorld.GetIntUpper(remainTime, refuTime)  | 
|       | 
|     #GameWorld.Log(" lostTime = %s ,value = %s , remainTime = %s , refuTime = %s"%( lostTime, value, remainTime, refuTime ) )  | 
|       | 
|     if lostTime <= 0:  | 
|         GameWorld.ErrLog(" skillID = %s, lostTime = %s ,value = %s , remainTime = %s , refuTime = %s" % (curBuff.GetSkill().GetSkillTypeID(), lostTime, value, remainTime, refuTime))  | 
|         return 0  | 
|       | 
|     lostValue = value / lostTime  | 
|     curBuff.SetValue(max(0, value - lostValue))  | 
|     return lostValue  | 
|   | 
| ## ¼ì²é¹â»·¼¼ÄܶÔÖÜΧ¶ÔÏó¼Ó¹â»·buff  | 
| #  @param curObjDetel µ±Ç°¶ÔÏóʵÀý  | 
| #  @param tick µ±Ç°Ê±¼ä   | 
| #  @return ²¼¶ûÖµ(ÊÇ·ñˢгɹ¦)  | 
| #  @remarks ¼ì²é¹â»·¼¼ÄÜ  | 
| def CheckAddAuraSkill(curObjDetel, tick):  | 
|     #µ±Ç°¶ÔÏóÏà¹Ø²ÎÊý  | 
|     curObjType = curObjDetel.GetGameObjType()  | 
|     buffManager = curObjDetel.GetAura()  | 
|     #ÓµÓеĹ⻷ÁÐ±í  | 
|     auraBuffList = []  | 
|       | 
|     for index in range(0, buffManager.GetBuffCount()):  | 
|         auraBuff = buffManager.GetBuff(index)  | 
|         if not auraBuff:  | 
|             continue  | 
|           | 
|         auraBuffList.append(auraBuff)  | 
|           | 
|     if not auraBuffList:  | 
|         return  | 
|       | 
|     #---Ö´Ðй⻷Âß¼---  | 
|     for auraBuff in auraBuffList:  | 
|           | 
|         buffOwnerID = auraBuff.GetOwnerID()  | 
|         buffOwnerType = auraBuff.GetOwnerType()  | 
|           | 
|         if buffOwnerID == 0:  | 
|             continue  | 
|           | 
|         buffOwner = GameWorld.GetObj(buffOwnerID, buffOwnerType)  | 
|         if buffOwner == None:  | 
|             continue  | 
|           | 
|         buffOwnerObjType = buffOwner.GetGameObjType()  | 
|         if curObjType != buffOwnerObjType:  | 
|             continue  | 
|           | 
|         # ·Ç¹âÔ´Ö÷È˲»´¦Àí  | 
|         if (curObjType == IPY_GameWorld.gotPlayer and buffOwnerID != curObjDetel.GetPlayerID()) or \  | 
|             (curObjType == IPY_GameWorld.gotNPC and buffOwnerID != curObjDetel.GetID()):  | 
|             continue  | 
|           | 
|         BaseAttack.SkillAddAuraBuff(curObjDetel, auraBuff.GetSkill(), tick)  | 
|   | 
|     return  | 
|   | 
| ## ¼ì²é¹â»·¼¼ÄÜ  | 
| #  @param curObjDetel µ±Ç°¶ÔÏóʵÀý  | 
| #  @param tick µ±Ç°Ê±¼ä   | 
| #  @return ²¼¶ûÖµ(ÊÇ·ñˢгɹ¦)  | 
| #  @remarks ¼ì²é¹â»·¼¼ÄÜ  | 
| def CheckAuraSkill(curObjDetel, tick):  | 
|     #µ±Ç°¶ÔÏóÏà¹Ø²ÎÊý  | 
|     curObjType = curObjDetel.GetGameObjType()  | 
|     buffManager = curObjDetel.GetAura()  | 
|     #ÓµÓеĹ⻷ÁÐ±í  | 
|     auraBuffList = []  | 
|     #ÊÇ·ñË¢ÐÂÊôÐÔ  | 
|     reFlash = False  | 
|       | 
|     for index in range(0, buffManager.GetBuffCount()):  | 
|         auraBuff = buffManager.GetBuff(index)  | 
|         if not auraBuff:  | 
|             continue  | 
|           | 
|         auraBuffList.append(auraBuff)  | 
|       | 
|     #---Ö´Ðй⻷Âß¼---  | 
|     for auraBuff in auraBuffList:  | 
|         buffSkill = auraBuff.GetSkill()  | 
|         buffSkillID = buffSkill.GetSkillID()  | 
|         auraSkillTypeID = buffSkill.GetSkillTypeID()  | 
|           | 
|         buffOwnerID = auraBuff.GetOwnerID()  | 
|         buffOwnerType = auraBuff.GetOwnerType()  | 
|           | 
|         if buffOwnerID == 0:  | 
|             continue  | 
|           | 
|         buffOwner = GameWorld.GetObj(buffOwnerID, buffOwnerType)  | 
|         #---ÎÞÖ÷µÄ¹â»·É¾³ý---  | 
|         if buffOwner == None :  | 
|             BuffSkill.DelBuffBySkillID(curObjDetel, buffSkillID, tick)  | 
|             reFlash = True  | 
|             continue  | 
|           | 
|         #---¼ì²é¾àÀë---  | 
|         atkRadius = buffSkill.GetAtkRadius()  | 
|           | 
|         dist = GameWorld.GetDist(curObjDetel.GetPosX(), curObjDetel.GetPosY(), buffOwner.GetPosX(), buffOwner.GetPosY())  | 
|           | 
|         if atkRadius and dist > atkRadius + 3:  | 
|             BuffSkill.DelBuffBySkillID(curObjDetel, buffSkillID, tick)  | 
|             reFlash = True  | 
|             continue  | 
|           | 
|         #BuffÓµÓÐÕßÏà¹Ø²ÎÊý  | 
|         buffOwnerSkillMgr = buffOwner.GetSkillManager()  | 
|           | 
|         #---NPC---  | 
|         if buffOwnerType == IPY_GameWorld.gotNPC:  | 
|             #NPC²»¿É¼ûɾ³ý  | 
|             if not buffOwner.GetVisible():  | 
|                 BuffSkill.DelBuffBySkillID(curObjDetel, buffSkillID, tick)  | 
|                 reFlash = True  | 
|                 continue  | 
|               | 
|             #δ·¢ÏÖÆäÓµÓм¼ÄÜ  | 
|             if not buffOwnerSkillMgr.FindSkillBySkillTypeID(auraSkillTypeID):  | 
|                 BuffSkill.DelBuffBySkillID(curObjDetel, buffSkillID, tick)  | 
|                 reFlash = True  | 
|                 continue  | 
|               | 
|             #---ÌØÊâ¼¼ÄÜÑéÖ¤---  | 
|               | 
|             #ÐþÌìÕæÑÔ, ÑéÖ¤¶ÓÎé  | 
|             if auraSkillTypeID == ChConfig.Def_SkillID_XuanTianZhenYan:  | 
|                 if curObjType != IPY_GameWorld.gotPlayer:  | 
|                     continue  | 
|                   | 
|                 petOwner = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, buffOwner)  | 
|                   | 
|                 if petOwner == None:  | 
|                     continue  | 
|                   | 
|                 #Ö÷È˲»É¾³ý  | 
|                 if GameWorld.IsSameObj(petOwner, curObjDetel):  | 
|                     continue  | 
|                   | 
|                 #ͬ×é¶ÓÎ鲻ɾ³ý  | 
|                 if petOwner.GetTeamID() != 0 and petOwner.GetTeamID() == curObjDetel.GetTeamID():  | 
|                     continue  | 
|                   | 
|                 BuffSkill.DelBuffBySkillID(curObjDetel, buffSkillID, tick)  | 
|                 reFlash = True  | 
|                 continue  | 
|   | 
|         #---Íæ¼Ò---  | 
|         elif buffOwnerType == IPY_GameWorld.gotPlayer:  | 
|             #Ïȼì²éа¶ñµÄ¶«Î÷(Áú»¢Áî,ÎïÆ·´¥·¢¹â»·,ÓÀ¾Ã´æÔÚ)  | 
|             if auraSkillTypeID in ChConfig.Def_SuperBuffList:  | 
|                 continue  | 
|               | 
|             #ÒòΪ¾ôλÊÇ×°±¸,ËùÒÔÒª¿¼Âǵ½ÊÇ·ñ×°±¸¾ôλ  | 
|             if not buffOwnerSkillMgr.FindSkillBySkillTypeID(auraSkillTypeID):  | 
|                 gankBuff = buffOwner.GetEquipBuff().FindBuff(auraSkillTypeID)  | 
|                 #ÒòΪ¾ôλµÄ¼¼ÄÜÀàÐÍIDÏàͬ,ËùÒÔÒªÔÙÕÒÒ»´Î  | 
|                 if gankBuff != None and gankBuff.GetSkill().GetSkillID() == buffSkillID:  | 
|                     #ÔÚÍæ¼ÒÉíÉÏÕÒµ½ÁËÕâ¸öBuff  | 
|                     continue  | 
|                   | 
|                 BuffSkill.DelBuffBySkillID(curObjDetel, buffSkillID, tick)  | 
|                 reFlash = True  | 
|                 continue  | 
|   | 
|         #---δ֪ÀàÐÍ---  | 
|         else:  | 
|             BuffSkill.DelBuffBySkillID(curObjDetel, buffSkillID, tick)  | 
|             reFlash = True  | 
|             GameWorld.Log('###¹â»·Òì³£,ÎÞ·¨²éÕÒ¹âÔ´ÀàÐÍ = %s' % (buffOwnerType))  | 
|             continue  | 
|   | 
|     return reFlash  | 
|   | 
|   | 
| ## ²éÕÒ¼¼Äܲ¢Ìí¼Óbuff  | 
| #  @param curObj Ä¿±êobj  | 
| #  @param skillType ¼¼ÄÜÀàÐÍ  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @param skillLV ¼¼Äܵȼ¶  | 
| #  @return None or True  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def AddBuffBySkillType(curObj , skillType , tick , skillLV=None):  | 
|     curSkill = None  | 
|       | 
|     if skillLV == None :  | 
|         curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillType)  | 
|     else:  | 
|         curSkill = GameWorld.GetGameData().FindSkillByType(skillType , skillLV)  | 
|       | 
|     if curSkill == None:  | 
|         GameWorld.Log("Ìí¼Óbuffʧ°Ü,Êý¾Ý¿â²éÕÒ¼¼ÄÜ = %s,ʧ°Ü!skillLV=%s" % (skillType, skillLV))  | 
|         return  | 
|       | 
|     buffType = GetBuffType(curSkill)  | 
|       | 
|     if not CheckCanAddBuff(curObj , buffType , curSkill.GetSkillTypeID(), curSkill.GetSkillLV()):  | 
|         return  | 
|       | 
|     #---Ìí¼ÓµÄBuffÖµ---  | 
|     addBuffValue = 0  | 
|     #ÊÇ·ñÊdzÖÐøÐÔ¼¼ÄÜ  | 
|     if curSkill.GetSkillType() in ChConfig.Def_LstBuff_List:  | 
|         callFunc = GameWorld.GetExecFunc(GameSkills, "SkillBuff_AddBuffValue.AddBuffValue")  | 
|               | 
|         if callFunc != None:  | 
|             addBuffValue = int(callFunc(curObj, None, curSkill, tick))  | 
|         else:  | 
|             GameWorld.ErrLog("SkillBuff_AddBuffValue.AddBuffValue")  | 
|       | 
|     return BuffSkill.DoAddBuff(curObj , buffType, curSkill , tick, [addBuffValue])  | 
|   | 
|   | 
| ## ²éÕÒ¼¼Äܲ¢Ìí¼Óbuff(²»Ë¢ÐÂ)  | 
| #  @param curObj Ä¿±ê  | 
| #  @param skillType ¼¼ÄÜÀàÐÍ  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @param skillLV ¼¼Äܵȼ¶  | 
| #  @return None or True  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def AddBuffBySkillType_NoRefurbish(curObj, skillType, tick, skillLV=None, plusValueList=[], buffOwner=None):  | 
|     curSkill = None  | 
|       | 
|     if skillLV == None :  | 
|         curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillType)  | 
|     else:  | 
|         curSkill = GameWorld.GetGameData().FindSkillByType(skillType , skillLV)  | 
|       | 
|     if curSkill == None:  | 
|         GameWorld.Log("Ìí¼Óbuffʧ°Ü,Êý¾Ý¿â²éÕÒ¼¼ÄÜ = %s,ʧ°Ü!skillLV=%s" % (skillType, skillLV))  | 
|         return  | 
|       | 
|     buffType = GetBuffType(curSkill)  | 
|       | 
|     if not CheckCanAddBuff(curObj , buffType , curSkill.GetSkillTypeID(), curSkill.GetSkillLV()):  | 
|         return  | 
|       | 
|     return BuffSkill.AddBuffNoRefreshState(curObj, buffType, curSkill, tick, plusValueList, buffOwner)  | 
|   | 
|   | 
| ## ¼ì²éÊÇ·ñ¿ÉÒÔÌí¼ÓÕâ¸öbuff   | 
| #  @param curObj Ìí¼ÓµÄ¶ÔÏó   | 
| #  @param buffType buffÀàÐÍ  | 
| #  @param curSkillTypeID ¼¼ÄÜID  | 
| #  @param curSkillLV ¼¼Äܵȼ¶  | 
| #  @return None or True  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def CheckCanAddBuff(curObj , buffType , curSkillTypeID, curSkillLV):  | 
|       | 
|     buffTuple = GetBuffManagerByBuffType(curObj, buffType)  | 
|     #ͨ¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷Ϊ¿Õ£¬ÔòÌø³ö  | 
|     if buffTuple == ():  | 
|         return  | 
|       | 
|     curObjBuffManager = buffTuple[0]  | 
|       | 
|     if curObjBuffManager == None:  | 
|         GameWorld.Log("###Òì³£,ÎÞ·¨²éÕÒÕâÀ༼ÄÜ = %s,buffÀàÐÍ = %s" % (curSkillTypeID , buffType))  | 
|         return True  | 
|       | 
|     curObjBuff = curObjBuffManager.FindBuff(curSkillTypeID)  | 
|       | 
|     if curObjBuff == None:  | 
|         #ÎÞÕâÀàbuff  | 
|         return True  | 
|       | 
|     if buffType == IPY_GameWorld.bfIncBuff:  | 
|         # ÔöÖµÀàBUFFµÍ¼¶¿ÉÒÔ¸²¸Ç¸ß¼¶  | 
|         return True  | 
|       | 
|     buffSkill = curObjBuff.GetSkill()  | 
|     buffSkillLV = buffSkill.GetSkillLV()  | 
|       | 
|     #ÒÑ´æÔÚ¸üÇ¿´óµÄЧ¹û  | 
|     if buffSkillLV > curSkillLV:  | 
|         return  | 
|           | 
|     if not buffSkill.GetLastTime():  | 
|         #GameWorld.DebugLog("ÎÞʱ¼äÏÞÖÆbuff£¬Ö»Òª´æÔÚbuff£¬ÔòÎÞÐèÖØ¸´Ìí¼Ó")  | 
|         return  | 
|       | 
|     return True  | 
|   | 
|   | 
| ## ´ÓBUFF¹ÜÀíÆ÷£¬Í¨¹ýЧ¹ûIDÕÒµ½BUFF  | 
| #  @param buffManager buff¹ÜÀíÆ÷  | 
| #  @param effectID Ð§¹ûID  | 
| #  @return None or Buff  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def FindBuff_BuffM_EffID(buffManager, effectID):  | 
|     for i in range(0, buffManager.GetBuffCount()):  | 
|         findBuff = buffManager.GetBuff(i)  | 
|         if not findBuff:  | 
|             continue  | 
|           | 
|         buffSkill = findBuff.GetSkill()  | 
|         if buffSkill.GetEffect(0).GetEffectID() == effectID:  | 
|             return findBuff  | 
|           | 
| ## Í¨¹ý¼¼ÄÜÀàÐÍid£¬Ð§¹ûIDÕÒµ½BUFF  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param skillTypeID Ð§¹ûID  | 
| #  @param effectID Ð§¹ûID  | 
| #  @return None or Buff     | 
| def FindBuffEff(curPlayer, skillTypeID, effID):  | 
|     curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillTypeID)  | 
|       | 
|     if curSkill == None:  | 
|         GameWorld.ErrLog("FindBuffBySkillAndEffID skillTypeID= %s DBNoFind" % (skillTypeID))  | 
|         return  | 
|       | 
|     buffTuple = GetBuffManagerByBuffType(curPlayer, GetBuffType(curSkill))  | 
|       | 
|     if buffTuple == ():  | 
|         GameWorld.ErrLog("FindBuffBySkillAndEffID skillTypeID= %s IsNoBuff" % (skillTypeID))  | 
|         return  | 
|       | 
|     buffManager = buffTuple[0]  | 
|       | 
|     return buffManager.FindEffect(effID)  | 
|   | 
|   | 
| ## Í¨¹ý¼¼ÄÜidÕÒµ½BUFF  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param skillTypeID ¼¼ÄÜid  | 
| #  @return findBuff, buffManager, buffType, findSkill  | 
| def FindBuffByID(tagObj, skillTypeID):  | 
|     # findBuff, buffManager, buffType, findSkill  | 
|     returnInfo = [None, None, None, None]  | 
|     findSkill = GameWorld.GetGameData().GetSkillBySkillID(skillTypeID)  | 
|     if not findSkill:  | 
|         GameWorld.ErrLog("FindBuff skillTypeID= %s DBNoFind" % (skillTypeID))  | 
|         return returnInfo  | 
|     buffType = GetBuffType(findSkill)  | 
|     buffTuple = GetBuffManagerByBuffType(tagObj, buffType)  | 
|     returnInfo[3] = findSkill  | 
|     returnInfo[2] = buffType  | 
|     #ͨ¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷Ϊ¿Õ£¬ÔòÌø³ö  | 
|     if buffTuple == ():  | 
|         return returnInfo  | 
|       | 
|     buffManager = buffTuple[0]  | 
|     findBuff = buffManager.FindBuff(skillTypeID)  | 
|     returnInfo[1] = buffManager  | 
|     returnInfo[0] = findBuff  | 
|       | 
|     return returnInfo  | 
|   | 
| #---------------------------------------------------------------------  | 
| ## Ö´ÐÐÇå¿ÕÃüÁî ²ÎÊý£ºÍæ¼Ò, ±£Áô¼¼ÄÜÀàÐÍÁÐ±í  | 
| #  @param curPlayer Íæ¼Ò  | 
| #  @param saveSkillTypeList ±£Áô¼¼ÄÜÀàÐÍÁÐ±í  | 
| #  @return ¿ÕÏм¼ÄÜµã  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def DoLogic_ReSetSkill(curPlayer , saveSkillTypeList=[]):  | 
|     #Çå¿ÕbuffЧ¹û  | 
|     curPlayer.GetBuffState().Clear()  | 
|     #ɱËÀÍæ¼ÒËùÓеÄÕÙ»½ÊÞ  | 
|     PlayerControl.KillPlayerSummonNPC(curPlayer)  | 
|     #»ñµÃÍæ¼ÒʹÓùýµÄ¼¼ÄÜµã  | 
|     savePoint = GetPlayerUseSkillPoint(curPlayer)  | 
|     #ÖØÖü¼ÄÜ  | 
|     ClearSkillManager(curPlayer , saveSkillTypeList)  | 
|     #ÉèÖÿÕÏм¼ÄÜµã  | 
|     curPlayer.SetFreeSkillPoint(curPlayer.GetFreeSkillPoint() + savePoint)  | 
|       | 
|     return savePoint  | 
|   | 
|   | 
| ## »ñµÃÍæ¼Òµ±Ç°Ò»¹²Í¶ÈëµÄ¼¼ÄÜµã  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return ¼¼ÄÜµã  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def GetPlayerUseSkillPoint(curPlayer):  | 
|     usePoints = 0  | 
|     #»ñµÃÍæ¼Ò¼¼ÄܹÜÀíÆ÷  | 
|     skillManager = curPlayer.GetSkillManager()  | 
|     #²»ÄÜ»ñµÃ¼¼ÄܵãµÄ¼¼ÄÜÀàÐÍÁÐ±í  | 
|     noPoints_SkillType_List = ReadChConfig.GetEvalChConfig('NoSkillPointSkill')  | 
|     #±éÀúÍæ¼ÒµÄ¼¼ÄÜÊýÁ¿  | 
|     for i in range(0, skillManager.GetSkillCount()):  | 
|         curSkill = skillManager.GetSkillByIndex(i)  | 
|           | 
|         if curSkill.GetSkillTypeID() in noPoints_SkillType_List:  | 
|             continue  | 
|           | 
|         usePoints = usePoints + curSkill.GetSkillLV()  | 
|           | 
|     return usePoints  | 
|   | 
| ## Çå¿Õ¼¼ÄܹÜÀíÆ÷¡£   | 
| #  @param curPlayer Íæ¼Ò   | 
| #  @param saveSkillTypeList ±£ÁôÁÐ±í   | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def ClearSkillManager(curPlayer , saveSkillTypeList):  | 
|     #ÏÈÇå¿Õ, ÔÚѧÉÏ  | 
|     playerHasSaveList = []  | 
|       | 
|     skillManager = curPlayer.GetSkillManager()  | 
|       | 
|     for i in range(0, skillManager.GetSkillCount()):  | 
|         curSkill = skillManager.GetSkillByIndex(i)  | 
|         curSkillType = curSkill.GetSkillTypeID()  | 
|           | 
|         #²»ÔÚ±£ÁôÁбíÖÐ, Ö±½Óɾ³ý  | 
|         if curSkillType not in saveSkillTypeList:  | 
|             continue  | 
|           | 
|         playerHasSaveList.append(curSkill.GetSkillID())  | 
|       | 
|     #Çå¿Õ¹ÜÀíÆ÷  | 
|     skillManager.ResetSkill()  | 
|       | 
|     #²¹Éϱ£ÁôµÄÁÐ±í  | 
|     for skillID in playerHasSaveList:  | 
|         skillManager.LVUPSkillByID(skillID)  | 
|       | 
|     return  | 
|   | 
| def GetSkillBattleType(curSkill):  | 
|     if not curSkill:  | 
|         return ChConfig.Def_BattleRelationType_Comm  | 
|     #0ͨӴ  1 PVPÀàÐÍ  2PVEÀàÐÍ    | 
|     return curSkill.GetHurtType()  | 
|   | 
| ## ¼ì²é¼¼ÄÜÊÇ·ñΪ±»¶¯¼¼ÄÜ, ÓÃÓÚ¿ØÖƲ»¿ÉÊͷż¼ÄÜ  | 
| def isPassiveSkill(curSkill):  | 
|     return curSkill.GetSkillType() in [ChConfig.Def_SkillType_Passive,  | 
|                                        ChConfig.Def_SkillType_PassiveBuff,  | 
|                                        ChConfig.Def_SkillType_AttrSkill,  | 
|                                        ChConfig.Def_SkillType_PassivePlsBuff,  #±»¶¯´¥·¢ÔöÒæÀàbuff 16  | 
|                                        ChConfig.Def_SkillType_PassiveDepBuff,  #±»¶¯´¥·¢¼õÒæÀàbuff 17  | 
|                                        ChConfig.Def_SkillType_PassiveActionBuff,  #±»¶¯´¥·¢µÄ¿ØÖÆÀàbuff 18  | 
|                                        ChConfig.Def_SkillType_PassiveLstPlsBuff,  #±»¶¯´¥·¢³ÖÐøÔöÒæÀàbuff 21  | 
|                                        ChConfig.Def_SkillType_PassiveLstDepBuff,  #±»¶¯´¥·¢³ÖÐø¼õÒæÀàbuff 22  | 
|                                        ]  | 
|   | 
| ## ±»¶¯´¥·¢µÄ¼¼ÄÜЧ¹û»òÕßÊͷż¼ÄÜ  | 
| def isPassiveTriggerSkill(curSkill):  | 
|     return curSkill.GetSkillType() in [ChConfig.Def_SkillType_Passive,  | 
|                                        ChConfig.Def_SkillType_PassiveBuff,  | 
|                                        ChConfig.Def_SkillType_PassivePlsBuff,  #±»¶¯´¥·¢ÔöÒæÀàbuff 16  | 
|                                        ChConfig.Def_SkillType_PassiveDepBuff,  #±»¶¯´¥·¢¼õÒæÀàbuff 17  | 
|                                        ChConfig.Def_SkillType_PassiveActionBuff,  #±»¶¯´¥·¢µÄ¿ØÖÆÀàbuff 18  | 
|                                        ChConfig.Def_SkillType_PassiveLstPlsBuff,  #±»¶¯´¥·¢³ÖÐøÔöÒæÀàbuff 21  | 
|                                        ChConfig.Def_SkillType_PassiveLstDepBuff,  #±»¶¯´¥·¢³ÖÐø¼õÒæÀàbuff 22  | 
|                                        ]  | 
|       | 
| def isPassiveAttr(curSkill):  | 
|     return (curSkill.GetSkillType() == ChConfig.Def_SkillType_AttrSkill)  | 
|   | 
| def isPassiveBuffSkill(curSkill):  | 
|     return (curSkill.GetSkillType() == ChConfig.Def_SkillType_PassiveBuff)  | 
|   | 
| # ÓÃÓÚ¼ì²éÊÇ·ñÔÚÊͷű»¶¯¼¼ÄÜÂß¼ÖУ¬±ÜÃâÑ»·µ÷Óñ»¶¯¼¼ÄÜ  | 
| def GetUsingPassiveSkill(attacker):  | 
|     return attacker.GetDictByKey("UsePassive")  | 
|   | 
| def SetUsingPassiveSkill(attacker, value):  | 
|     return attacker.SetDict("UsePassive", value)  | 
|   | 
| def CheckPlayerAtkInterval(curPlayer, skillTypeID, tick):  | 
|     ''' ÑéÖ¤ÊÇ·ñ»ù±¾¹¥»÷¼ä¸ô '''  | 
|     return False  | 
|     #===========================================================================  | 
|     # SetAttackTick ¸Ä³ÉÈë¿ÚÉèÖÃÑéÖ¤¿Í»§¶ËµÄ¼ä¸ô´Ë´¦ÑéÖ¤ÎÞЧ  | 
|     # if tick - curPlayer.GetPlayerAttackTick() < 50:  | 
|     #    GameWorld.DebugLog("ѹ°üÌ«Ãܼ¯50ºÁÃ룬 ±£µ×¹¥»÷¼ä¸ôÖР%s" % (skillTypeID))  | 
|     #    return True  | 
|     #   | 
|     # return False  | 
|     #===========================================================================  | 
|   | 
| ## ¼ì²é,ÊÇ·ñÊǵ±Ç°Ö°Òµ¼¼ÄÜ£¬°´Î»ÑéÖ¤  | 
| #  @param µ±Ç°Íæ¼Ò  | 
| #  @param µ±Ç°¼¼ÄÜ  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def CheckSkillJob(curPlayer, curSkill):  | 
|     skillUseType = curSkill.GetUseType()  | 
|       | 
|     if skillUseType == 0:  | 
|         #ÎÞÏÞÖÆ  | 
|         return True  | 
|       | 
|     #Ö°ÒµÏÞÖÆ curPlayerJob ´Ó0¿ªÊ¼  | 
|     return True if (skillUseType & pow(2, curPlayer.GetJob())) else False  | 
|   | 
|   | 
| ## ÊÇ·ñÊÇ»ù´¡ÊôÐÔЧ¹û  | 
| #  @param effect Ð§¹û  | 
| #  @return ²¼¶ûÖµ  | 
| #  @remarks ÊÇ·ñÊÇ»ù´¡ÊôÐÔЧ¹û  | 
| def IsBaseEffect(effect):  | 
|     return (effect.GetEffectID() in ChConfig.Def_BaseEffectList)  | 
|   | 
| #---------------------------------------------------------------------  | 
| ## »ñµÃÖÎÁÆ»ù´¡Öµ£¨Ä¿Ç°ÓÃÓÚ³ÖÐøÐÔ¼¼ÄܵļÆË㣩  | 
| #  @param attacker ¹¥»÷Õß  | 
| #  @param useSkill Ê¹Óõļ¼ÄÜ  | 
| #  @return »ù´¡ÖÎÁÆÖµ  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def GetCureBaseValue(attacker, useSkill):  | 
|     return GetAttackerHurtValueByAtkType(attacker, AttackCommon.GetBattleType(attacker, useSkill))  | 
|   | 
| ## »ñµÃ»ù´¡É˺¦Öµ£¨Ä¿Ç°ÓÃÓÚ³ÖÐøÐÔ¼¼ÄܵļÆË㣩  | 
| #  @param attacker ¹¥»÷Õß  | 
| #  @param useSkill Ê¹Óõļ¼ÄÜ  | 
| #  @return »ù´¡É˺¦Öµ  | 
| #  @remarks »ñµÃ»ù´¡É˺¦Öµ  | 
| def GetHurtBaseValue(attacker, useSkill):  | 
|     return GetAttackerHurtValueByAtkType(attacker, AttackCommon.GetBattleType(attacker, useSkill))  | 
|   | 
| #---------------------------------------------------------------------  | 
| ## Í¨¹ý¹¥»÷ÀàÐÍ»ñµÃ¹¥»÷·½É˺¦Öµ  | 
| #  @param attacker ¹¥»÷Õß  | 
| #  @param atkType ¹¥»÷ÀàÐÍ£¨ÎïÀí¹¥»÷¡¢Ä¦·¨¹¥»÷£©  | 
| #  @return ¹¥»÷·½É˺¦Öµ  | 
| #  @remarks Í¨¹ý¹¥»÷ÀàÐÍ»ñµÃ¹¥»÷·½É˺¦Öµ  | 
| def GetAttackerHurtValueByAtkType(attacker, atkType):  | 
|       | 
|     return (attacker.GetMinAtk() + random.random() * (attacker.GetMaxAtk() - attacker.GetMinAtk()))  | 
|     #===========================================================================  | 
|     # if atkType == IPY_GameWorld.ghtPhy:  | 
|     #    #(×îС¹¥»÷ + rand()*( ×î´ó¹¥»÷É˺¦-×îС¹¥»÷É˺¦ )  | 
|     #    return (attacker.GetMinAtk() + random.random() * (attacker.GetMaxAtk() - attacker.GetMinAtk()))  | 
|     #   | 
|     # #(×îС½£ÆøÉ˺¦ + rand()*( ×î´ó½£ÆøÉ˺¦-×îС½£ÆøÉ˺¦ )  | 
|     # return (attacker.GetMAtkMin() + random.random() * (attacker.GetMAtkMax() - attacker.GetMAtkMin()))  | 
|     #===========================================================================  | 
|   | 
| #---------------------------------------------------------------------  | 
| ## »ñµÃij¼¼ÄܹÜÀíÆ÷ÊÇ·ñÓÐÌØ¶¨¼¼ÄÜ  | 
| #  @param buffManage Ä³buff¹ÜÀíÆ÷  | 
| #  @param givenSkillTypeList Ìض¨¼¼ÄÜÀàÐÍÁÐ±í  | 
| #  @return ÊÇ·ñÓÐÌØ¶¨¼¼ÄÜ  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def IsHasGivenBuff(buffManage, givenSkillTypeList):  | 
|     buffCount = buffManage.GetBuffCount()  | 
|       | 
|     for i in range(buffCount):  | 
|         buffObj = buffManage.GetBuff(i)  | 
|         curSkillType = buffObj.GetSkill().GetSkillType()  | 
|           | 
|         if curSkillType in givenSkillTypeList:  | 
|             return True  | 
|           | 
|     return False  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##»ñµÃÇøÓò¼¼ÄÜÉ˺¦¶ÔÏóÊýÁ¿  | 
| # @param curSkill ¼¼ÄÜʵÀý  | 
| # @return ·µ»ØÖµ, É˺¦ÊýÁ¿  | 
| # @remarks »ñµÃÇøÓò¼¼ÄÜÉ˺¦¶ÔÏóÊýÁ¿  | 
| def GetSkillArea_Atk_Count(attacker, curSkill):  | 
|     #ĬÈϹ¥»÷×î´óÊý  | 
|     hurtCount = 50  | 
|       | 
|     curEffect = GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_AreaAttackkCount)  | 
|       | 
|     if curEffect != None:  | 
|         #ÕÒµ½ÁË  | 
|         hurtCount = min(curEffect.GetEffectValue(0), hurtCount)  | 
|       | 
|     hurtCount += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(attacker, None, curSkill,   | 
|                                                                      ChConfig.TriggerType_AttackCnt)  | 
|       | 
|     #GameWorld.GodLog( 'SkillName = %s, hurtCount = %s'%( curSkill.GetSkillName(), hurtCount ) )  | 
|     return hurtCount  | 
|   | 
| ##ͨ¹ýЧ¹ûIDÕÒ³öÖ¸¶¨¼¼ÄܵÄЧ¹û  | 
| # @param curSkill ¼¼ÄÜʵÀý  | 
| # @param effectID ¼¼ÄÜЧ¹ûID  | 
| # @return ·µ»ØÐ§¹û  | 
| # @remarks Í¨¹ýЧ¹ûIDÕÒ³öÖ¸¶¨¼¼ÄܵÄЧ¹û  | 
| def GetSkillEffectByEffectID(curSkill, effectID):  | 
|     for i in range(0, curSkill.GetEffectCount()):  | 
|         curEffect = curSkill.GetEffect(i)  | 
|         curEffectID = curEffect.GetEffectID()  | 
|           | 
|         if not curEffectID:  | 
|             #²ß»®ÓпÉÄÜÖÐ;ɾ³ý£¬²»ÓÃreturn  | 
|             continue  | 
|           | 
|         #²»ÊÇÐèÒªµÄЧ¹û  | 
|         if curEffectID != effectID:  | 
|             continue  | 
|           | 
|         #ÕÒµ½ÁË  | 
|         return curEffect  | 
|       | 
|     return  | 
|   | 
| ## Í¨¹ý¼¼ÄÜÀàÐÍID»ñµÃµ±Ç°Íæ¼Ò¶ÔÓ¦µÄbuff¶ÔÏó  | 
| #  @param curPlayer µ±Ç°Íæ¼Òobj  | 
| #  @param skillID Òª²éÕҵļ¼ÄÜÀàÐÍID  | 
| #  @return Íæ¼Òbuff¶ÔÏó  | 
| #  @remarks Í¨¹ý¼¼ÄÜÀàÐÍID»ñµÃµ±Ç°Íæ¼Ò¶ÔÓ¦µÄbuff¶ÔÏó  | 
| def GetPlayerBuffBySkillTypeID(curPlayer, skillTypeID):  | 
|     curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillTypeID)  | 
|       | 
|     if curSkill == None:  | 
|         GameWorld.ErrLog("GetPlayerBuffBySkillTypeID = %s DBNoFind" % (skillTypeID))  | 
|         return  | 
|       | 
|     buffTuple = GetBuffManagerByBuffType(curPlayer, GetBuffType(curSkill))  | 
|       | 
|     if buffTuple == ():  | 
|         GameWorld.ErrLog("GetPlayerBuffBySkillTypeID  = %s IsNoBuff" % (skillTypeID))  | 
|         return  | 
|       | 
|     buffManager = buffTuple[0]  | 
|       | 
|     return buffManager.FindBuff(skillTypeID)      | 
|       | 
| ##´Óij¸ö¼¼ÄÜÕÒµ½Ö¸¶¨µÄ¼¼ÄÜЧ¹ûIDÖÐAÖµ¶ÔÓ¦IDµÄÒÑѧ¼¼ÄÜ  | 
| # @param tagObj   | 
| # @param curSkill  | 
| # @param effectID  | 
| # @return ²éÕҵļ¼ÄÜ  | 
| # @remarks Ä¿Ç°ÓÃÓÚÎÞµÐÕ¶ºÍ½£Èз籩Ïà¹ØµÄ¿ÉѧµÄ±»¶¯¼¼ÄÜ  | 
| def GetSkillFromOtherSkillByEffectID(tagObj, curSkill, effectID):  | 
|     curSkillEff = GetSkillEffectByEffectID(curSkill, effectID)  | 
|       | 
|     if curSkillEff == None:  | 
|         #GameWorld.ErrLog("ûÓб»¶¯¼¼ÄÜЧ¹ûÏî%s ID=%s, Lv=%s"%(effectID,   | 
|         #            curSkill.GetSkillID(), curSkill.GetSkillLV()))  | 
|         return None  | 
|       | 
|     return tagObj.GetSkillManager().FindSkillBySkillTypeID(curSkillEff.GetEffectValue(0))  | 
|   | 
|   | 
| ##»ñµÃÖÎÁÆÖµ  | 
| # @param userObj Ê©·¨Õß  | 
| # @param tagObj ÊÜЧ¹ûÕß  | 
| # @param curSkill ¼¼ÄÜ  | 
| # @param cureType ÖÎÁÆÀàÐÍ£¨Ó°Ï칫ʽ£©×Ô¶¨Ò壺1.É˺¦ 2.×î´óѪÁ¿  | 
| # @return ÖÎÁÆÖµ  | 
| # @remarks »ñµÃÖÎÁÆÖµ  | 
| def GetCureHP(userObj, tagObj, curSkill, cureType=ChConfig.Def_Cure_Attack):  | 
|     curePercent = 1.0     #ÖÎÁƼӳÉÖµ  | 
|     cureBaseValue = 0     #ÖÎÁÆ»ù´¡Öµ  | 
|       | 
|     #passiveSkill = GetSkillFromOtherSkillByEffectID(userObj, curSkill, ChConfig.Def_Skill_Effect_PassiveSkillID)  | 
|       | 
|     #¸Ã±»¶¯¼¼ÄÜÒÑѧ, Ôò´¦Àí±»¶¯Ó°ÏìµÄЧ¹û  | 
|     #===========================================================================  | 
|     # if passiveSkill != None and isPassiveSkill(passiveSkill):  | 
|     #    cureEffect = GetSkillEffectByEffectID(passiveSkill, ChConfig.Def_Skill_Effect_CureUpper)  | 
|     #   | 
|     #    #¼ÆËãÖÎÁƼӳÉ,°´¼¸ÂÊ´¥·¢  | 
|     #    if GameWorld.CanHappen(passiveSkill.GetHappenRate(), ChConfig.Def_MaxRateValue) \  | 
|     #    and cureEffect != None:  | 
|     #        curePercent += cureEffect.GetEffectValue(0) / float(ChConfig.Def_MaxRateValue)  | 
|     #===========================================================================  | 
|       | 
|     #ÌØÊâ¼¼Äܵĸ½¼ÓÖµ  | 
|     addExValue = 0   | 
|       | 
|     #»ñµÃ»ù´¡ÖÎÁÆÖµ  | 
|     if cureType == ChConfig.Def_Cure_Attack:  | 
|         cureBaseValue = GetCureBaseValue(userObj, curSkill)  | 
|     elif cureType == ChConfig.Def_Cure_MaxHP:  | 
|         cureBaseValue = GameObj.GetMaxHP(userObj)  | 
|     elif cureType == ChConfig.Def_Cure_PNE:  | 
|         cureBaseValue = userObj.GetPNE()  | 
|         addPer = curSkill.GetEffect(0).GetEffectValue(2)/float(ChConfig.Def_MaxRateValue)  | 
|         addExValue = GetCureBaseValue(userObj, curSkill)*addPer  | 
|     elif cureType == ChConfig.Def_Cure_PHY:  | 
|         cureBaseValue = GameObj.GetMaxHP(userObj)  | 
|     elif cureType == ChConfig.Def_Cure_HurtValue:  | 
|         cureBaseValue = userObj.GetDictByKey(ChConfig.Def_PlayerKey_LastHurtValue)  | 
|     elif cureType == ChConfig.Def_Cure_TagMaxHP:  | 
|         cureBaseValue = 0 if not tagObj else GameObj.GetMaxHP(tagObj)  | 
|           | 
|           | 
|     #Õâ±ßдËÀÁËЧ¹û1£¬»ù±¾ÒѾ¶¨ÐÍ  | 
|     #»ñµÃ¼¼ÄܵļÆËã²ÎÊýÖµ  | 
|     if cureType == ChConfig.Def_Cure_PHY:  | 
|         # ¸ù¾ÝÃô½Ý,Á¦Á¿²îÖµ¼°Ð§¹ûϵÊý¼ÆËã»Ö¸´±ÈÀý  | 
|         skillPer = max(0, userObj.GetPHY() - userObj.GetSTR()) / float(curSkill.GetEffect(0).GetEffectValue(0))  | 
|         GameWorld.DebugLog("Ó¢Ó¸´ËÕ: Ãô=%s,Á¦=%s,skillPer=%s" % (userObj.GetPHY(), userObj.GetSTR(), skillPer))  | 
|     else:   | 
|         skillPer = curSkill.GetEffect(0).GetEffectValue(0) / float(ChConfig.Def_MaxRateValue)  | 
|     #¼¼Äܸ½¼Ó  | 
|     skillValue = curSkill.GetEffect(0).GetEffectValue(1)  | 
|       | 
|     #¹«Ê½¼ÆËãÖÎÁÆÖµ   | 
|     cureHP = int((cureBaseValue * skillPer + skillValue + addExValue) * curePercent)  | 
|       | 
|     #GameWorld.DebugLog("»ñÈ¡ÖÎÁÆÖµ(%s)£ºcureType=%s,cureBaseValue=%s,skillPer=%s,skillValue=%s"   | 
|     #                   % (cureHP, cureType, cureBaseValue, skillPer, skillValue))  | 
|     return cureHP  | 
|   | 
|   | 
| ##»ñµÃ»ØÄ§Öµ  | 
| # @param userObj Ê©·¨Õß  | 
| # @param tagObj ÊÜЧ¹ûÕß  | 
| # @param curSkill ¼¼ÄÜ  | 
| # @param restoreType »Ö¸´ÀàÐÍ£¨Ó°Ï칫ʽ£©  | 
| # @return »Ö¸´Öµ  | 
| def GetRestoreMP(userObj, tagObj, curSkill, restoreType=ChConfig.Def_Restore_MaxMP):  | 
|       | 
|     cureBaseValue = 0     #»ù´¡Öµ  | 
|       | 
|     if restoreType == ChConfig.Def_Restore_MaxMP:  | 
|         cureBaseValue = userObj.GetMaxMP()  | 
|     elif restoreType == ChConfig.Def_Restore_PHY:  | 
|         cureBaseValue = userObj.GetMaxMP()  | 
|           | 
|     #Õâ±ßдËÀÁËЧ¹û1£¬»ù±¾ÒѾ¶¨ÐÍ  | 
|     #»ñµÃ¼¼ÄܵļÆËã²ÎÊýÖµ  | 
|     if restoreType == ChConfig.Def_Restore_PHY:  | 
|         # ¸ù¾ÝÃô½Ý¡¢ÖÇÁ¦²îÖµ¼°Ð§¹ûϵÊý¼ÆËã»Ö¸´±ÈÀý  | 
|         skillPer = max(0, userObj.GetPHY() - userObj.GetPNE()) / float(curSkill.GetEffect(0).GetEffectValue(0))  | 
|         GameWorld.DebugLog("ħȪӿ¶¯: Ãô=%s,ÖÇ=%s,skillPer=%s" % (userObj.GetPHY(), userObj.GetPNE(), skillPer))  | 
|     else:   | 
|         skillPer = curSkill.GetEffect(0).GetEffectValue(0) / float(ChConfig.Def_MaxRateValue)  | 
|           | 
|     #¼¼Äܸ½¼Ó  | 
|     skillValue = curSkill.GetEffect(0).GetEffectValue(1)  | 
|       | 
|     #¹«Ê½¼ÆËã  | 
|     restoreMP = int(cureBaseValue * skillPer + skillValue)  | 
|     #GameWorld.DebugLog("GetRestoreMP restoreType=%s,restoreMP=%s" % (restoreType, restoreMP))  | 
|     return restoreMP  | 
|           | 
|   | 
| ## ¸üм¼ÄÜÁ¬»÷Êý  | 
| #  @param attacker   | 
| #  @param skill Ê¹Óõļ¼ÄÜ  | 
| #  @return   | 
| def UpdateSkillCombo(attacker, skill, tick):  | 
|     return  | 
|     #===========================================================================  | 
|     # if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:  | 
|     #    return  | 
|     #   | 
|     # SkillComboDict = ReadChConfig.GetEvalChConfig("SkillCombo")  | 
|     # jobType = ChConfig.JOB_TYPE_DICT[attacker.GetJob()]  | 
|     #   | 
|     # if jobType not in SkillComboDict:  | 
|     #    return  | 
|     #   | 
|     # jobSkillComboDict = SkillComboDict[jobType]  | 
|     #   | 
|     # curSkillTypeID = skill.GetSkillTypeID()  | 
|     #   | 
|     # isCombo = False  | 
|     # lastComboTick = attacker.GetDictByKey(ChConfig.Def_PlayerKey_LastSkillComboTick)  | 
|     # comboCnt = attacker.GetDictByKey(ChConfig.Def_PlayerKey_SkillComboCnt)  | 
|     # buffProcessState = attacker.GetDictByKey(ChConfig.Def_PlayerKey_ComboBuffProcessState)  | 
|     # # ³ÖÐøÐÔÉ˺¦buffÒÑ´¦Àí¹ý²»ÔÙ´¦Àí  | 
|     # if curSkillTypeID in ChConfig.Ded_ComboBuffProcessSkillIDList and buffProcessState:  | 
|     #    #GameWorld.DebugLog("³ÖÐøÐÔÉ˺¦buffÒÑ´¦Àí¹ý²»ÔÙ´¦Àí£º%s" % curSkillTypeID)  | 
|     #    return  | 
|     #   | 
|     # for comboNum, comboInfo in jobSkillComboDict.items():  | 
|     #      | 
|     #    skillList = comboInfo[0]  | 
|     #    stateSkillReq = comboInfo[1]  | 
|     #    comboInterval = comboInfo[2]  | 
|     #    addHurtPerFormat = comboInfo[3]  | 
|     #    modulusPlusHappenRate = comboInfo[4]    # É˺¦ÏµÊý¼Ó³É¸ÅÂÊÍò·ÖÂÊ  | 
|     #    modulusPlusFormat = comboInfo[5]    # É˺¦ÏµÊý¹«Ê½  | 
|     #      | 
|     #    if curSkillTypeID not in skillList:  | 
|     #        continue  | 
|     #      | 
|     #    # Èç¹ûÓÐ×Ë̬ҪÇó  | 
|     #    if stateSkillReq != 0:  | 
|     #        buffState = attacker.GetBuffState()  | 
|     #        if buffState.FindBuff(stateSkillReq) == None:  | 
|     #            #GameWorld.DebugLog("·Ç¶ÔÓ¦Ö°Òµ×Ë̬(%s)£¬ÎÞ·¨Á¬»÷£¡" % stateSkillReq)  | 
|     #            continue  | 
|     #      | 
|     #    curComboCnt = skillList.index(curSkillTypeID) + 1 # µ±Ç°¼¼ÄÜËùÔÚÁ¬»÷Êý  | 
|     #      | 
|     #    # Ôڹ涨ʱ¼äÄÚÍê³ÉÁ¬»÷  | 
|     #    #GameWorld.DebugLog("skillList=%s, curSkillTypeID=%s,comboCnt=%s,curComboCnt=%s,tick=%s,lastComboTick=%s,(%s),comboInterval=%s"   | 
|     #    #                   % (skillList, curSkillTypeID, comboCnt, curComboCnt, tick, lastComboTick, tick - lastComboTick, comboInterval))  | 
|     #    if comboCnt > 0 and (comboCnt + 1) == curComboCnt and (tick - lastComboTick) <= comboInterval:  | 
|     #        isCombo = True  | 
|     #        #GameWorld.DebugLog("    Á¬»÷³É¹¦!")  | 
|     #      | 
|     #    # µÚÒ»»÷  | 
|     #    elif curComboCnt == 1:  | 
|     #        GameWorld.DebugLog("    ¼¼ÄܵÚÒ»»÷!")  | 
|     #        comboCnt = 0  | 
|     #        isCombo = True  | 
|     #          | 
|     #    if isCombo:  | 
|     #        STR = attacker.GetSTR()  | 
|     #        PHY = attacker.GetPHY()  | 
|     #        modulus = 1 # É˺¦ÏµÊý  | 
|     #        if GameWorld.CanHappen(modulusPlusHappenRate):  | 
|     #            modulus = eval(modulusPlusFormat)  | 
|     #        addHurtPer = eval(addHurtPerFormat)  | 
|     #        attacker.SetDict(ChConfig.Def_PlayerKey_LastSkillComboTick, tick)  | 
|     #        attacker.SetDict(ChConfig.Def_PlayerKey_SkillComboCnt, curComboCnt)  | 
|     #        attacker.SetDict(ChConfig.Def_PlayerKey_ComboSkillTypeID, curSkillTypeID)  | 
|     #        attacker.SetDict(ChConfig.Def_PlayerKey_ComboAddHurtPer, addHurtPer)  | 
|     #        if curSkillTypeID in ChConfig.Ded_ComboBuffProcessSkillIDList:  | 
|     #            attacker.SetDict(ChConfig.Def_PlayerKey_ComboBuffProcessState, 1)  | 
|     #            #GameWorld.DebugLog("    ³ÖÐøÐÔÉ˺¦buffÁ¬»÷£¡%s" % curSkillTypeID)  | 
|     #              | 
|     #          | 
|     #        # Í¨Öª¿Í»§¶ËÁ¬»÷Êý  | 
|     #        skillComboPack = ChPyNetSendPack.tagMCSkillCombo()  | 
|     #        skillComboPack.Clear()  | 
|     #        skillComboPack.ComboNum = comboNum  | 
|     #        skillComboPack.ComboCnt = curComboCnt  | 
|     #        NetPackCommon.SendFakePack(attacker, skillComboPack)  | 
|     #        GameWorld.DebugLog("¼¼ÄÜÁ¬»÷: num=%s,curCnt=%s,comboCnt=%s,Á¦=%s,Ãô=%s,modulus=%s,addHurtPer=%s"   | 
|     #                           % (comboNum, curComboCnt, comboCnt, STR, PHY, modulus, addHurtPer))  | 
|     #        break  | 
|     #   | 
|     # # Ã»ÓÐÁ¬»÷³É¹¦, ÖØÖÃÁ¬»÷ÐÅÏ¢  | 
|     # if not isCombo and comboCnt != 0:  | 
|     #    attacker.SetDict(ChConfig.Def_PlayerKey_LastSkillComboTick, 0)  | 
|     #    attacker.SetDict(ChConfig.Def_PlayerKey_SkillComboCnt, 0)  | 
|     #    attacker.SetDict(ChConfig.Def_PlayerKey_ComboSkillTypeID, 0)  | 
|     #    attacker.SetDict(ChConfig.Def_PlayerKey_ComboAddHurtPer, 0)  | 
|     #    attacker.SetDict(ChConfig.Def_PlayerKey_ComboBuffProcessState, 0)  | 
|     #    GameWorld.DebugLog("Á¬»÷ʧ°Ü£¡curSkillTypeID=%s" % curSkillTypeID)  | 
|     #      | 
|     # return  | 
|     #===========================================================================  | 
|           | 
|          |