#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#  
 | 
##@package E:/GameSVN/U3DGame/ProjectSServer/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py  
 | 
# @todo:   
 | 
#  
 | 
# @author: Alee  
 | 
# @date 2017-10-24 ÏÂÎç05:23:55  
 | 
# @version 1.0  
 | 
#  
 | 
# @note:   
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
#===============================================================================  
 | 
# ËµÃ÷ ------------  
 | 
# ÔÚC++ÖРIsBattleState µÄº¯Êý  
 | 
# bool           Player::IsBattleState()  
 | 
# {  
 | 
#    //Èç¹ûÓÐNPC¶ÔÕâ¸öÍæ¼ÒÓгðºÞ, ÔòÊÇÕ½¶·×´Ì¬  
 | 
#    if(m_AngryNPC.Count() != 0)  
 | 
#        return  true;  
 | 
#    return      m_IsBattleState;  
 | 
# }  
 | 
#   
 | 
# ½á¹ûΪ ·µ»ØµÄÕæÖµ ²»Ò»¶¨´ú±í m_IsBattleStateÊÇÕæÖµ  
 | 
#===============================================================================  
 | 
import random  
 | 
import GameWorld  
 | 
import ChConfig  
 | 
import IPY_GameWorld  
 | 
import PlayerControl  
 | 
import NPCCommon  
 | 
#import ItemControler  
 | 
import SkillCommon  
 | 
import EffGetSet  
 | 
import FBLogic  
 | 
import EventShell  
 | 
import ReadChConfig  
 | 
import PetControl  
 | 
import GameMap  
 | 
import PlayerTruck  
 | 
#import PlayerPrestigeSys  
 | 
import PlayerFamily  
 | 
#import BossHurtMng  
 | 
import PassiveBuffEffMng  
 | 
import PlayerSuccess  
 | 
import GameFuncComm  
 | 
import ShareDefine  
 | 
import SkillShell  
 | 
import PlayerVip  
 | 
import FormulaControl  
 | 
import IpyGameDataPY  
 | 
import PyGameData  
 | 
import GameObj  
 | 
import BuffSkill  
 | 
import PlayerState  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
import FamilyRobBoss  
 | 
import FBCommon  
 | 
import ChNPC  
 | 
  
 | 
import datetime  
 | 
import math  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
  
 | 
  
 | 
# µ¥´ÎÉËѪÁбí°ü×°£¬NPCѪÁ¿Óг¬¹ý20EµÄÇé¿ö£¬ÓÃÓÚ֪ͨ·â°ü  
 | 
# @param hurtList ÊÇg_skillHurtList  
 | 
def AddHurt(tagObj, hurtList, hurtType, hurtValue):  
 | 
    tagObjType = tagObj.GetGameObjType()  
 | 
      
 | 
    #if tagObjType == IPY_GameWorld.gotPlayer:  
 | 
    if not hasattr(tagObj, "GetHPEx"):  
 | 
        # Ä¿±êÊÇÍæ¼ÒÔò³¬¹ýxxÒÚ²¿·ÖΪ0£¬Íæ¼ÒÔÝÎÞ¿ª·Å½Ó¿Ú  
 | 
        hurtList.AddHurt(tagObjType, tagObj.GetID(), hurtType, hurtValue, tagObj.GetHP(), 0)  
 | 
    else:  
 | 
        hurtList.AddHurt(tagObjType, tagObj.GetID(), hurtType, hurtValue, tagObj.GetHP(), tagObj.GetHPEx())  
 | 
  
 | 
# ÉËѪÁбíÀÛ»ý¼Ç¼£¬³¬DWORDÌØÊâËõ¼õ´¦Àí  
 | 
def AddHurtValue(defender, attackID, attackHurtType, value):  
 | 
    defendHurtList = defender.GetPlayerHurtList()  
 | 
    if not hasattr(defender, "GetMaxHPEx"):  
 | 
        defendHurtList.AddHurtValue(attackID, attackHurtType, value)  
 | 
        return  
 | 
      
 | 
    #×ÜѪÁ¿Óг¬¹ýDWORDµÄÇé¿ö  
 | 
    value = NPCCommon.FixValueByValueEx(defender.GetMaxHPEx(), value)  
 | 
    defendHurtList.AddHurtValue(attackID, attackHurtType, value)  
 | 
      
 | 
def AddTeamPlayerHurtValue(defender, teamID, playerID, value):  
 | 
    # Ìí¼Ó¶ÓÎé³ÉÔ±¶ÔNPCÉËѪÀÛ¼Æ  
 | 
    if not teamID:  
 | 
        return  
 | 
    if defender.GetGameObjType() != IPY_GameWorld.gotNPC:  
 | 
        return  
 | 
    teamPlayerHurtDict = PyGameData.g_teamPlayerHurtValue  
 | 
    lineID = GameWorld.GetGameWorld().GetLineID()  
 | 
    key = (lineID, defender.GetID(), defender.GetNPCID())  
 | 
    if key not in teamPlayerHurtDict:  
 | 
        teamPlayerHurtDict[key] = {}  
 | 
    hurtDict = teamPlayerHurtDict[key]  
 | 
    hurtKey = (teamID, playerID)  
 | 
    hurtDict[hurtKey] = hurtDict.get(hurtKey, 0) + value  
 | 
    #GameWorld.DebugLog("AddTeamPlayerHurtValue teamID=%s, playerID=%s, value=%s, key=%s, %s"   
 | 
    #                   % (teamID, playerID, value, key, teamPlayerHurtDict))  
 | 
    return  
 | 
  
 | 
def GetTeamPlayerHurtValue(curPlayer, defender):  
 | 
    # »ñÈ¡¶ÓÎé³ÉÔ±¶ÔNPCµÄÉËѪÀÛ¼Æ  
 | 
    teamPlayerHurtDict = PyGameData.g_teamPlayerHurtValue  
 | 
    #GameWorld.DebugLog("GetTeamPlayerHurtValue %s" % (teamPlayerHurtDict))  
 | 
    teamID = curPlayer.GetTeamID()  
 | 
    if not teamID:  
 | 
        return 0  
 | 
    if defender.GetGameObjType() != IPY_GameWorld.gotNPC:  
 | 
        return 0  
 | 
    lineID = GameWorld.GetGameWorld().GetLineID()  
 | 
    key = (lineID, defender.GetID(), defender.GetNPCID())  
 | 
    if key not in teamPlayerHurtDict:  
 | 
        return 0  
 | 
    hurtDict = teamPlayerHurtDict[key]  
 | 
    hurtKey = (teamID, curPlayer.GetPlayerID())  
 | 
    return hurtDict.get(hurtKey, 0)  
 | 
  
 | 
def GetTeamPlayerHurtPer(curPlayer, defender):  
 | 
    # »ñÈ¡¶ÓÎé³ÉÔ±¶ÔNPCµÄÉËѪÁ¿ÔÚ¶ÓÎé×ÜÉËѪÁ¿µÄÕ¼±È  
 | 
    teamPlayerHurtDict = PyGameData.g_teamPlayerHurtValue  
 | 
    teamID = curPlayer.GetTeamID()  
 | 
    if not teamID:  
 | 
        return 0  
 | 
    if defender.GetGameObjType() != IPY_GameWorld.gotNPC:  
 | 
        return 0  
 | 
    lineID = GameWorld.GetGameWorld().GetLineID()  
 | 
    key = (lineID, defender.GetID(), defender.GetNPCID())  
 | 
    if key not in teamPlayerHurtDict:  
 | 
        return 0  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    playerHurtValue = 0  
 | 
    teamHurtValue = 0  
 | 
    # ÕâÀïÖ»Ëã±¾¶ÓÎéÄÚ¶ÓÔ±µÄÉ˺¦±ÈÀý£¬¼´ ¶ÓÔ±É˺¦/±¾¶Ó¶ÓÔ±×ÜÉ˺¦  
 | 
    hurtDict = teamPlayerHurtDict[key]  
 | 
    for key, hurtValue in hurtDict.items():  
 | 
        hurtTeamID, hurtPlayerID = key  
 | 
        if hurtTeamID != teamID:  
 | 
            continue  
 | 
          
 | 
        teamHurtValue += hurtValue  
 | 
        if hurtPlayerID == playerID:  
 | 
            playerHurtValue = hurtValue  
 | 
      
 | 
    if playerHurtValue == 0 or teamHurtValue == 0:  
 | 
        hurtPer = 0  
 | 
    else:  
 | 
        hurtPer = playerHurtValue * 1.0 / teamHurtValue  
 | 
    #GameWorld.DebugLog("GetTeamPlayerHurtPer playerHurtValue=%s,teamHurtValue=%s,maxHP=%s,hurtPer=%s"   
 | 
    #                   % (playerHurtValue, teamHurtValue, GameObj.GetMaxHP(defender), hurtPer), playerID)  
 | 
    return hurtPer  
 | 
  
 | 
def ClearTeamPlayerHurtValue(defender):  
 | 
    # Çå³ýNPC¶ÓÎéÀÛ¼ÆÉËѪ  
 | 
    teamPlayerHurtDict = PyGameData.g_teamPlayerHurtValue  
 | 
    if defender.GetGameObjType() != IPY_GameWorld.gotNPC:  
 | 
        return  
 | 
    lineID = GameWorld.GetGameWorld().GetLineID()  
 | 
    key = (lineID, defender.GetID(), defender.GetNPCID())  
 | 
    #GameWorld.DebugLog("ClearTeamPlayerHurtValue key=%s, %s" % (key, teamPlayerHurtDict))  
 | 
    if key in teamPlayerHurtDict:  
 | 
        teamPlayerHurtDict.pop(key)  
 | 
    #GameWorld.DebugLog("    teamPlayerHurtDict=%s" % (teamPlayerHurtDict))  
 | 
    return  
 | 
  
 | 
## »ñµÃÍæ¼ÒPKÊÇ·ñºÏ·¨  
 | 
#  @param curPlayer É±ÈËÕß  
 | 
#  @param curTagPlayer ±»É±Õß  
 | 
#  @return PKÊÇ·ñºÏ·¨  
 | 
#  @remarks »ñµÃÍæ¼ÒPKÊÇ·ñºÏ·¨  
 | 
def GetIsPKLegality(curPlayer, tagPlayer):  
 | 
      
 | 
    #Èç¹û²»ÊÇÍæ¼Ò»¥ÏàPK,²»´¦ÀíÂß¼  
 | 
    if curPlayer == None or tagPlayer == None:  
 | 
        return True  
 | 
      
 | 
    #Èç¹ûÔÚÌØÊ⸱±¾ÖУ¬ÄÇô¾ÍûÓгͷ£  
 | 
    #if not FBLogic.DoFBAttackHasPunish(curPlayer , curTagPlayer):  
 | 
    #    return True  
 | 
      
 | 
    #ºÏ·¨PKÇøÓò  
 | 
    legalityAreaList = [IPY_GameWorld.gatFreePK, IPY_GameWorld.gatFamilyPK]  
 | 
    if GameMap.GetAreaTypeByMapPos(curPlayer.GetPosX(), curPlayer.GetPosY()) in legalityAreaList \  
 | 
        or GameMap.GetAreaTypeByMapPos(tagPlayer.GetPosX(), tagPlayer.GetPosY()) in legalityAreaList:  
 | 
        return True  
 | 
      
 | 
    #¶ñÒâ¹¥»÷×Ô¼ºµÄÍæ¼Ò »ò ÓÐPKÖµµÄ(¶ñÒâɱÈ˲ŻáÓÐPKÖµ)  
 | 
    if IsMaliciousAttackPlayer(curPlayer, tagPlayer) or tagPlayer.GetPKValue() > 0:  
 | 
        #Ä¿±êÍæ¼ÒºìÃû  
 | 
        return True  
 | 
      
 | 
    #ÆäËû¶¼²»ºÏ·¨£¬·µ»ØFalse  
 | 
    return False  
 | 
      
 | 
## ¼ì²âÍæ¼ÒPKËÀÍöºóÃû×ֱ仯  
 | 
#  @param curPlayer É±ÈËÕß  
 | 
#  @param curTagPlayer ±»É±Õß  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def AddPKValue(curPlayer, curTagPlayer, tick):  
 | 
      
 | 
    #PKºÏ·¨£¬²»³Í·££¬Ìø³ö  
 | 
    if GetIsPKLegality(curPlayer, curTagPlayer):  
 | 
        #GameWorld.DebugLog("ºÏ·¨»÷É±Íæ¼Ò!tagPlayerID=%s" % curTagPlayer.GetPlayerID(), curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    #Ôö¼ÓPKÖµ  
 | 
    PlayerControl.AddPlayerPKValue(curPlayer, tick)  
 | 
  
 | 
    #֪ͨGameServer, Ìí¼Ó³ðÈË  
 | 
    curTagPlayer.GameServer_AddEnemy(curPlayer.GetID(), curPlayer.GetName())  
 | 
    return  
 | 
  
 | 
  
 | 
## µ±Íæ¼ÒɱËÀïÚ³µµÄʱºò´¥·¢  
 | 
#  @param curPlayer É±ÈËÕß  
 | 
#  @param defender ±»É±Õß  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def OnPlayerKillTruck(curPlayer, curTruck, tick):  
 | 
      
 | 
    if curPlayer == None or curTruck == None:  
 | 
        return  
 | 
      
 | 
    #ÇøÓò  
 | 
    curPlayerAreaType = GameMap.GetAreaTypeByMapPos(curPlayer.GetPosX(), curPlayer.GetPosY())  
 | 
    truckAreaType = GameMap.GetAreaTypeByMapPos(curTruck.GetPosX(), curTruck.GetPosY())  
 | 
      
 | 
    #×ÔÓÉÇøÓò£¬ºÏ·¨£¬·µ»ØTrue  
 | 
    if curPlayerAreaType == IPY_GameWorld.gatFreePK or truckAreaType == IPY_GameWorld.gatFreePK:         
 | 
        return  
 | 
      
 | 
    #¼Ò×åÇøÓò£¬PK²»ÊÇͬһ¼Ò×åµÄÍæ¼Ò»òÆä³èÎºÏ·¨£¬·µ»ØTrue  
 | 
    if curPlayerAreaType == IPY_GameWorld.gatFamilyPK or truckAreaType == IPY_GameWorld.gatFamilyPK:  
 | 
        return  
 | 
      
 | 
    #ÒѾËÀÍöÁË,²»±äÉ«  
 | 
    if curPlayer.GetHP() <= 0:  
 | 
        return  
 | 
      
 | 
    curPlayerNameColor = curPlayer.GetPlayerNameColor()  
 | 
    #×Ô¼ºÈç¹û²»Êǰ×Ãû¾Í²»±äÉ«  
 | 
    if curPlayerNameColor != IPY_GameWorld.pncNormal:  
 | 
        return  
 | 
      
 | 
    curTruckNameColor = PlayerTruck.GetTruckNameColor(curTruck)  
 | 
    if curTruckNameColor != IPY_GameWorld.pncNormal:  
 | 
        #Ä¿±êÍæ¼Ò²»Êǰ×Ãû¾Í²»±äÉ«  
 | 
        return  
 | 
      
 | 
    #»ÒÃû(9)  
 | 
    #SkillCommon.AddBuffBySkillType(curPlayer , ChConfig.Def_SkillID_Gray , tick)  
 | 
    return  
 | 
  
 | 
  
 | 
## µ±Íæ¼ÒɱËÀÍæ¼ÒµÄʱºò´¥·¢  
 | 
#  @param curPlayer É±ÈËÕß  
 | 
#  @param defender ±»É±Õß  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def OnPlayerKillPlayer(curPlayer, defender, tick):  
 | 
      
 | 
    PlayerState.SetPKStateTick(curPlayer, tick)  
 | 
      
 | 
    #´¥·¢»÷É±Íæ¼Òʼþ  
 | 
    EventShell.EventResponse_OnKillEnemy(curPlayer, defender)  
 | 
      
 | 
    #´¥·¢±»É±Ê¼þ  
 | 
    EventShell.EventResponse_OnEnemyKill(defender, curPlayer)  
 | 
      
 | 
    #֪ͨ  
 | 
    PlayerControl.NotifyCode(defender, "PK_lhs_318691", [curPlayer.GetName()])  
 | 
      
 | 
    #¸øÓèɱÈ˽±Àø  
 | 
    #if FBLogic.DoFBOnKill_Player_ValuePrize(curPlayer, defender, tick):  
 | 
    __GiveKill_Player_ValuePrize(curPlayer, defender, tick)  
 | 
      
 | 
    #Ö´Ðи±±¾É±ÈËÂß¼  
 | 
    if FBLogic.DoFBOnKill_Player(curPlayer, defender, tick):  
 | 
        return  
 | 
      
 | 
    #¼ÓPKÖµ  
 | 
    AddPKValue(curPlayer, defender, tick)  
 | 
      
 | 
    #»÷É±Íæ¼Ò¹ã²¥Âß¼  
 | 
    __DoKillPlayerNotify(curPlayer, defender)  
 | 
      
 | 
    #´òbossÖв»Ôö¼Ó 2018/7/18¸ÄΪֻҪÔÚÒ°ÍâµØÍ¼±»ÆäËûÍæ¼ÒɱËÀ¶¼Ôö¼ÓÆ£ÀÍ  
 | 
    #if not PlayerState.IsInBossState(curPlayer):  
 | 
    if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull:  
 | 
        PlayerControl.NomalDictSetProperty(defender, ChConfig.Def_PDict_IsAddReviveTired, 1)  
 | 
    return  
 | 
  
 | 
  
 | 
## »÷É±Íæ¼ÒÏà¹ØÌáʾ  
 | 
#  @param attacker É±ÈËÕß  
 | 
#  @param defender ±»É±Õß  
 | 
#  @return None  
 | 
def __DoKillPlayerNotify(attacker, defender):  
 | 
      
 | 
    defFamilyID = defender.GetFamilyID()  
 | 
    if defFamilyID <= 0:  
 | 
        return  
 | 
              
 | 
    defFamilyMemberLv = defender.GetFamilyMemberLV()  
 | 
    defName = defender.GetName()  
 | 
    atkName = attacker.GetName()  
 | 
      
 | 
    defMapID = defender.GetMapID()  
 | 
    defPosX = defender.GetPosX()  
 | 
    defPosY = defender.GetPosY()   
 | 
    if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:  
 | 
        return  
 | 
      
 | 
    lineID = GameWorld.GetGameWorld().GetLineID()  
 | 
    # É±ÈËÍæ¼ÒÓаï»á  
 | 
    if attacker.GetFamilyID() > 0:  
 | 
        atkFamilyName = attacker.GetFamilyName()  
 | 
        atkFamilyMemberLv = attacker.GetFamilyMemberLV()  
 | 
          
 | 
        notifyCode = 'PK_pan_671654'   
 | 
        paramList = [defFamilyMemberLv, defName, defMapID, atkFamilyName, atkFamilyMemberLv, atkName, defPosX, defPosY, lineID]  
 | 
          
 | 
    else:  
 | 
        # É±ÈËÍæ¼ÒÎÞ°ï»á  
 | 
        notifyCode = 'PK_pan_318691'  
 | 
        paramList = [defFamilyMemberLv, defName, defMapID, atkName,defPosX, defPosY, lineID]  
 | 
      
 | 
    PlayerControl.FamilyNotify(defFamilyID, notifyCode, paramList)  
 | 
  
 | 
    # ÓÐְλ±»É±£¬È«·þ¹ã²¥  
 | 
    if defFamilyMemberLv <= 0:  
 | 
        return  
 | 
      
 | 
    defFamilyName = defender.GetFamilyName()  
 | 
  
 | 
    killCnt = attacker.GetDictByKey(ChConfig.Def_PlayerKey_KillPlayerCnt % defender.GetPlayerID()) + 1  
 | 
    attacker.SetDict(ChConfig.Def_PlayerKey_KillPlayerCnt % defender.GetPlayerID(), killCnt)  
 | 
    #±»É±ÖØÖû÷ɱÊý  
 | 
    defender.SetDict(ChConfig.Def_PlayerKey_KillPlayerCnt % attacker.GetPlayerID(), 0)  
 | 
      
 | 
    killPlayerNotifyDict = IpyGameDataPY.GetFuncEvalCfg('FamilyKilledNotify')  
 | 
      
 | 
    killKeys = sorted(killPlayerNotifyDict.keys())  
 | 
    notifyKey = 0   
 | 
    for killCntKey in killKeys:  
 | 
        if killCnt < killCntKey:  
 | 
            break  
 | 
        notifyKey = killCntKey  
 | 
    if notifyKey in killPlayerNotifyDict:  
 | 
        notifyMark = killPlayerNotifyDict[notifyKey]  
 | 
        PlayerControl.WorldNotify(0, notifyMark, [atkName, defMapID, defFamilyName, defFamilyMemberLv, defName])  
 | 
          
 | 
    return  
 | 
  
 | 
def OnNPCHitPlayer(curNPC, defender, tick):  
 | 
    if ChConfig.IsGameBoss(curNPC):  
 | 
        PlayerState.SetBossStateTick(defender, tick)  
 | 
    return  
 | 
  
 | 
## µ±Íæ¼Ò¹¥»÷Íæ¼ÒµÄʱºò´¥·¢  
 | 
#  @param curPlayer ¹¥»÷Obj  
 | 
#  @param defender ·ÀÓùObj  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def OnPlayerHitPlayer(attacker, defender, tick):  
 | 
    #´¦Àí¸±±¾¹¥»÷Íæ¼Òʼþ  
 | 
    if attacker.GetID() == defender.GetID():  
 | 
        #GameWorld.DebugLog("×Ô¼º²»´¦Àí: %s" % attacker.GetID())  
 | 
        return  
 | 
      
 | 
    #if FBLogic.DoFBOnHit_Player(attacker, defender, tick):  
 | 
    #    return  
 | 
      
 | 
    #¶ñÒâ¹¥»÷  
 | 
    if not GetIsPKLegality(attacker, defender):  
 | 
        AddMaliciousAttackPlayer(attacker, defender, tick)  
 | 
        #»ÒÃû(9)  
 | 
        #SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, ChConfig.Def_SkillID_Gray, tick)  
 | 
    else:  
 | 
        UpdMaliciousAttackTick(attacker, defender, tick)  
 | 
          
 | 
    #Ìí¼ÓÉËѪ¼Ç¼  
 | 
    AddPlayerHitPlayerHurt(attacker, defender, tick)  
 | 
      
 | 
    #Ö»ÒªÒ»·½·¢Æð¹¥»÷£¬Ë«·½¾ù½øÈëPK״̬  
 | 
    PlayerState.SetPKStateTick(attacker, tick)  
 | 
    PlayerState.SetPKStateTick(defender, tick)  
 | 
    return  
 | 
  
 | 
## Ìí¼ÓÉËѪ¼Ç¼  
 | 
#  @param curPlayer ¹¥»÷Obj  
 | 
#  @param defender ·ÀÓùObj  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def AddPlayerHitPlayerHurt(attacker, defender, tick):  
 | 
    #Ìí¼ÓÉËѪ¼Ç¼  
 | 
    defPlayerHurtList = defender.GetPlayerHurtList()  
 | 
      
 | 
    #³¬¹ýÉÏÏÞÁË, ²»Ìí¼Ó  
 | 
    if defPlayerHurtList.GetHurtCount() >= ChConfig.Def_PlayerHurtListCount:  
 | 
        return  
 | 
      
 | 
    AddHurtValue(defender, attacker.GetPlayerID(), ChConfig.Def_NPCHurtTypePlayer, 1)  
 | 
    return  
 | 
  
 | 
## ±»¹¥»÷Õß±»¶¯buff´¥·¢  
 | 
#  @param curTagPlayer ±»¹¥»÷Õß  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @param isSuperHit ±©»÷  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def DefenderSpringBuff(curTagPlayer, tick, isSuperHit=False):  
 | 
    return  
 | 
     
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
def GetBattleRelationType(attacker, defender):  
 | 
    if not defender:  
 | 
        return ChConfig.Def_BattleRelationType_Comm  
 | 
      
 | 
    #0ͨÓà 1 PVPÀàÐÍ  2PVEÀàÐÍ    
 | 
    attackPlayer, attackNPC = GetAttackPlayer(attacker)  
 | 
    defenderPlayer, defenderNPC = GetAttackPlayer(defender)  
 | 
      
 | 
    if attackPlayer and defenderPlayer:  
 | 
        return ChConfig.Def_BattleRelationType_PVP  
 | 
      
 | 
    return ChConfig.Def_BattleRelationType_PVE  
 | 
  
 | 
# ÅжÏPK¹ØÏµÊÇ·ñ¿É¹¥»÷ Def_BattleRelationType_CommNoBossÒ²¿É¹¥»÷ Ö»Êǹ¥»÷ÎÞЧ¹û  
 | 
def CheckBattleRelationType(skillBattleType, battleRelationType):  
 | 
    if skillBattleType in [ChConfig.Def_BattleRelationType_Comm, ChConfig.Def_BattleRelationType_CommNoBoss]:  
 | 
        return True  
 | 
      
 | 
    #if battleRelationType in [ChConfig.Def_BattleRelationType_Comm, ChConfig.Def_BattleRelationType_CommNoBoss]:  
 | 
    #    return True  
 | 
      
 | 
    if skillBattleType != battleRelationType:  
 | 
        # PKģʽµÄÅж¨  
 | 
        return False  
 | 
    return True  
 | 
  
 | 
## »ñÈ¡¹¥»÷ÀàÐÍ  
 | 
#  @param attack ¹¥»÷·½¶ÔÏó  
 | 
#  @param attackUseSkill ¹¥»÷·½Ê¹Óõļ¼ÄÜ  
 | 
#  @return ¹¥»÷ÀàÐÍ Èç IPY_GameWorld.ghtPhy  
 | 
#  @remarks »ñÈ¡¹¥»÷ÀàÐÍ  
 | 
def GetBattleType(attack, attackUseSkill):  
 | 
    # GetHurtTypeÓ÷¨¸Ä³É pvp pve±êʶ  
 | 
    return IPY_GameWorld.ghtPhy  
 | 
#    #---¼¼Äܹ¥»÷, ¶Á±í»ñÈ¡¹¥»÷ÀàÐÍ---  
 | 
#    if attackUseSkill != None:  
 | 
#        return attackUseSkill.GetHurtType()  
 | 
#  
 | 
#    #---ÆÕͨ¹¥»÷---  
 | 
#  
 | 
#    #Íæ¼ÒËãÆÕͨ¹¥»÷  
 | 
#    if attack.GetGameObjType() == IPY_GameWorld.gotPlayer:  
 | 
#        return IPY_GameWorld.ghtPhy  
 | 
#  
 | 
#    #NPC¶Á±íÈ¡  
 | 
#    return attack.GetHurtType()  
 | 
  
 | 
## ÊäÈë»ù´¡ÊýÖµ,·µ»ØÔöÇ¿ºóµÄÖµ - ¼¼ÄܼÓÇ¿  
 | 
#  @param value »ù´¡Öµ  
 | 
#  @param skill ¼¼ÄÜ  
 | 
#  @return ÔöÇ¿ºóµÄÖµ  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def GetEnhanceValue(value, skill):  
 | 
    per = skill.GetEffect(0).GetEffectValue(0)  
 | 
    eff = skill.GetEffect(0).GetEffectValue(1)  
 | 
    #GameWorld.Log("±»¶¯ -> ×ÔÉíÊôÐÔ,¼¼ÄÜID = %s,¼¼ÄÜÔöÇ¿ = %s,¸½¼Ó = %s , »ù´¡Öµ = %s"%(skill.GetSkillName(),per,eff,value))  
 | 
    return max(value * per / ChConfig.Def_MaxRateValue + eff , 1)  
 | 
  
 | 
## ÊäÈë»ù´¡ÊýÖµ,·µ»ØÔöÇ¿ºóµÄÖµ (LV)- Ð§¹û¼ÓÇ¿  
 | 
#  @param value »ù´¡Öµ  
 | 
#  @param eff Ð§¹û  
 | 
#  @return ÔöÇ¿ºóµÄÖµ  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def GetEnhanceValue_Eff(value, eff):  
 | 
    per = eff.GetEffectValue(0)  
 | 
    eff = eff.GetEffectValue(1)  
 | 
    #GameWorld.Log("value = %s,per = %s,erf = %s"%(value,per,eff))  
 | 
    return max(value * per / ChConfig.Def_MaxRateValue + eff , 1)  
 | 
  
 | 
## ÊäÈë»ù´¡Ð§¹ûÖµ,(Íæ¼ÒË÷Òý) -> ¼¼ÄÜÔöÇ¿  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param curEffect µ±Ç°Ð§¹û  
 | 
#  @return ÔöÇ¿ºóµÄÖµ  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def GetEnhanceIndexValue_Eff(curPlayer, curEffect):  
 | 
    index = curEffect.GetEffectValue(0)  
 | 
    skillPer = curEffect.GetEffectValue(1)  
 | 
    effect = curEffect.GetEffectValue(2)  
 | 
    maxValue = EffGetSet.GetValueByEffIndex(curPlayer, index)  
 | 
    #GameWorld.Log("-----%s,%s,%s,%s"%(index,skillPer,effect,maxValue))  
 | 
      
 | 
    if maxValue == None:  
 | 
        return 0  
 | 
      
 | 
    return max(maxValue * skillPer / ChConfig.Def_MaxRateValue + effect , 1)  
 | 
#--------------------------------------------------------------------------  
 | 
## ÉèÖÃÍæ¼Ò½øÈëÕ½¶·×´Ì¬  
 | 
#  @param defender µ±Ç°Íæ¼Ò£¨±»¹¥»÷ÁË£©  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def SetPlayerBattleState(defender, tick):  
 | 
    #ÉèÖÃÍæ¼Ò¿ªÊ¼Õ½¶·Ê±¼ä  
 | 
    defender.SetLastBattleTick(tick)  
 | 
      
 | 
    #·ÇÕ½¶·ÖÐ,½øÈëÕ½¶·×´Ì¬  
 | 
    defender.SetBattleState(True)  
 | 
      
 | 
    return  
 | 
#--------------------------------------------------------------------------  
 | 
  
 | 
## ¸øµ±Ç°Íæ¼ÒµÄËùÓÐÕÙ»½ÊÞÌí¼Ó³ðºÞ   
 | 
#  @param curObj ³ðºÞ¶ÔÏó  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param angryValue ³ðºÞÖµ  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def SummonAddAngryByOwner(curObj, curPlayer, angryValue):  
 | 
    #Íæ¼ÒµÄÕÙ»½ÊÞ,Èç¹ûÖ÷È˹¥»÷ģʽ²»¿É¹¥»÷µ±Ç°Ä¿±ê,È«²¿²»Ìí¼Ó  
 | 
    if curObj.GetGameObjType() == IPY_GameWorld.gotPlayer and not CheckPlayerAttackMode_Player(curPlayer, curObj):  
 | 
        return  
 | 
      
 | 
    #Èç¹û¹¥»÷·½ÊÇNPC²¢ÇÒÊÇÏÝÚåÔò²»Ìí¼Ó³ðºÞ  
 | 
    if curObj.GetGameObjType() == IPY_GameWorld.gotNPC and \  
 | 
    curObj.GetType() == IPY_GameWorld.ntFairy:  
 | 
        return  
 | 
          
 | 
    #¸øÕâ¸öÍæ¼ÒµÄÕÙ»½ÊÞÌí¼Ó³ðºÞ  
 | 
    for i in range(0, curPlayer.GetSummonCount()):  
 | 
        curTagSummon = curPlayer.GetSummonNPCAt(i)  
 | 
        #²»¾ß±¸¹¥»÷ÄÜÁ¦µÄÕÙ»½ÊÞ,²»Ìí¼Ó  
 | 
        if not GetNPC_Has_Attack(curTagSummon):  
 | 
            continue  
 | 
          
 | 
        #¹Ì¶¨µÄÕÙ»½ÊÞ³¬¹ý¹¥»÷¾àÀë,²»Ìí¼Ó  
 | 
        if not curTagSummon.GetOrgSpeed() and not CheckNPCAttackDist(curTagSummon, curObj, None):  
 | 
            continue  
 | 
          
 | 
        summonControl = NPCCommon.NPCControl(curTagSummon)  
 | 
        summonControl.AddObjToAngryList(curObj, angryValue, True, False)  
 | 
      
 | 
    #---Èç¹ûÕâ¸öÍæ¼ÒÓгèÎï³öÕ½£¬ÔòÌí¼Ó³ðºÞ---  
 | 
    petMgr = curPlayer.GetPetMgr()  
 | 
    fightPetObj = petMgr.GetFightPet()  # ³öÕ½µÄ³èÎï¶ÔÏó  
 | 
    if fightPetObj != None:  
 | 
        petControl = NPCCommon.NPCControl(fightPetObj)  
 | 
        petControl.AddObjToAngryList(curObj, angryValue)  
 | 
          
 | 
    return  
 | 
  
 | 
## ¼ì²éNPCÊÇ·ñÓй¥»÷Á¦  
 | 
#  @param curNPC µ±Ç°NPC  
 | 
#  @return npcµÄ¹¥»÷Á¦  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def GetNPC_Has_Attack(curNPC):  
 | 
    #×îСÎï¹¥, ×î´óÎï¹¥  
 | 
    return (curNPC.GetMinAtk() or curNPC.GetMaxAtk())  
 | 
  
 | 
#--------------------------------------------------------------------------  
 | 
  
 | 
## Íæ¼Ò¹¥»÷ʧ°ÜϵͳÌáʾ  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param message ÌáʾÐÅÏ¢ ÈçChConfig.Def_PASysMessage_None  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def PlayerAttackFailSysMessanage(curPlayer , message):  
 | 
      
 | 
    #ÎÞÌáʾ£¬Ö±½ÓÌø³ö  
 | 
    if message == ChConfig.Def_PASysMessage_None:  
 | 
        return  
 | 
      
 | 
    #ÌáʾÔÒò¼°¶ÔÓ¦µÄÌáʾmark×é³ÉµÄ×Öµä  
 | 
    messageDic = ChConfig.Def_MessageDic  
 | 
      
 | 
    #ÕÒ²»µ½´«ÈëµÄÔÒò¶ÔÓ¦µÄÌáʾmark£¬Ìø³ö  
 | 
    if message not in messageDic.keys():  
 | 
        GameWorld.ErrLog('Íæ¼Ò¹¥»÷ʧ°ÜϵͳÌáʾÕÒ²»µ½¶ÔÓ¦µÄÌáʾmark,´«ÈëµÄÔÒò£º%s' % message, curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    PlayerControl.NotifyCode(curPlayer, messageDic[message])  
 | 
      
 | 
    return  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## Íæ¼Ò¹¥»÷ģʽÅжϠ  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param curTagPlayer Ä¿±êÍæ¼Ò   
 | 
#  @return True or False ÊÇ·ñ¿ÉÒÔ¹¥»÷Ä¿±ê  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckPlayerAttackMode_Player(curPlayer, curTagPlayer) :  
 | 
      
 | 
    #´Ë²»×öÅж¨£¬Í³Ò»ÔÚGetPlayersRelation(curPlayer, curTagPlayer)º¯ÊýÖÐ×öÅж¨  
 | 
    #·µ»Ø¿É¹¥»÷  
 | 
    return True  
 | 
      
 | 
      
 | 
#===============================================================================  
 | 
#---------------------------------------------------------------------  
 | 
#2010-5-26 chenxuewei ½£Ê¥ÏîÄ¿ÐÂÊÖ×î´óµÈ¼¶Îª30¼¶£¨Ìáµ½ChConfig£©  
 | 
## »ñµÃÊÇ·ñÊÇÐÂÊÖ  
 | 
#  @param curPlayer Íæ¼Ò¶ÔÏó  
 | 
#  @return True or False  
 | 
#  @remarks »ñµÃcurPlayerÊÇ·ñÊÇÐÂÊÖ  
 | 
def GetIsNewGuy(curPlayer):  
 | 
      
 | 
    if curPlayer.GetLV() < IpyGameDataPY.GetFuncCfg("PKConfig", 5):  
 | 
        return True  
 | 
      
 | 
    return False  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
#¹ØÏµÓÐ3²ã£¬ÎÞ-ÓѺÃ-µÐÈË  
 | 
## ÅжÏÊÇ·ñÎÞ¹ØÏµ£¬¼´ÊÇ·ñ¿ÉÊÍ·Å(Ôö/¼õ)¼¼ÄÜ»òÆÕ¹¥  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param curTagPlayer Ä¿±êÍæ¼Ò   
 | 
#  @return True or False  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckPlayersRelationInFB_IsNone(curPlayer , curTagPlayer):  
 | 
    mapType = GameWorld.GetMap().GetMapFBType()  
 | 
    #²»ÔÚ¸±±¾ÖÐ  
 | 
    if mapType == IPY_GameWorld.fbtNull:  
 | 
        return False  
 | 
      
 | 
    return FBLogic.CheckPlayersRelationInFB_IsNone(curPlayer , curTagPlayer)  
 | 
  
 | 
#¹ØÏµÓÐ3²ã£¬ÎÞ-ÓѺÃ-µÐÈË  
 | 
##ÅжÏÊÇ·ñÓѺùØÏµ£¬¸Ã²ãÅж¨ÎªÓѺÃÂß¼ÖеÄ×îºóÅÐ¶Ï  
 | 
# @param curPlayer Íæ¼ÒʵÀý  
 | 
# @param curTagPlayer Ä¿±êÍæ¼ÒʵÀý  
 | 
# @return ²¼¶ûÖµ  
 | 
def CheckPlayersRelationInFB_IsFriend(curPlayer, curTagPlayer):  
 | 
    # hxp - ²»×öµØÍ¼ÀàÐÍÅжϣ¬ÔÚÄÚ²ãÅжϣ¬ÊÊÓ¦ËùÓеØÍ¼£¬Õ½ÃËÌìÌÃÐèÇó  
 | 
#    mapType = GameWorld.GetMap().GetMapFBType()  
 | 
#    #²»ÔÚ¸±±¾ÖÐ  
 | 
#    if mapType == IPY_GameWorld.fbtNull:  
 | 
#        return False  
 | 
      
 | 
    return FBLogic.CheckPlayersRelationInFB_IsFriend(curPlayer , curTagPlayer)  
 | 
  
 | 
  
 | 
## Íæ¼ÒÔÚ¸±±¾ÖÐ,¿É·ñ¹¥»÷¶ÔÔ±  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param curTagPlayer Ä¿±êÍæ¼Ò   
 | 
#  @return True or False  
 | 
#  @remarks Íæ¼ÒÔÚ¸±±¾ÖÐ,¿É·ñ¹¥»÷¶ÔÔ±  
 | 
def PlayerCanAttackTeamerInFB(curPlayer , curTagPlayer):  
 | 
    # hxp - ²»×öµØÍ¼ÀàÐÍÅжϣ¬ÔÚÄÚ²ãÅжϣ¬ÊÊÓ¦ËùÓеØÍ¼£¬Õ½ÃËÌìÌÃÐèÇó  
 | 
#    mapType = GameWorld.GetMap().GetMapFBType()  
 | 
#    #²»ÔÚ¸±±¾ÖÐ  
 | 
#    if mapType == IPY_GameWorld.fbtNull:  
 | 
#        return False  
 | 
      
 | 
    return FBLogic.DoCanAttackTeamer(curPlayer , curTagPlayer)  
 | 
  
 | 
#--------------------------------------------------------------------------  
 | 
  
 | 
## Ìí¼Ó¶ÔÏóµ½NPCÉËѪÁÐ±í   
 | 
#  @param curObj ¹¥»÷·½  
 | 
#  @param curTagNPC ·ÀÊØ·½(NPC)  
 | 
#  @param curTaglNPCHPBefore ·ÀÊØ·½±»¹¥»÷ǰѪÁ¿  
 | 
#  @param hurtHP ¹¥»÷ÉËѪֵ  
 | 
#  @return None or True  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def NPCAddObjInHurtList(curObj, curTagObj, curTaglNPCHPBefore, hurtHP) :  
 | 
    if curObj == None:  
 | 
        GameWorld.ErrLog("NPCAddObjInHurtList NoFindObj")  
 | 
        return  
 | 
  
 | 
    if curTaglNPCHPBefore < hurtHP:  
 | 
        hurtHP = curTaglNPCHPBefore  
 | 
  
 | 
    defNPCHurtList = curTagObj.GetPlayerHurtList()  
 | 
    curObjType = curObj.GetGameObjType()  
 | 
    if curObjType == IPY_GameWorld.gotPlayer:  
 | 
        #BossHurtMng.BossAddPlayerInHurtList(curObj, curTagObj, hurtHP)  
 | 
        FamilyRobBoss.OnPlayerHurtFamilyOwnerBoss(curObj, curTagObj, hurtHP)  
 | 
        if curTagObj.GetGameObjType() == IPY_GameWorld.gotNPC:  
 | 
            FBLogic.DoFB_Player_HurtNPC(curObj, curTagObj, hurtHP)  
 | 
        if GameObj.GetHP(curTagObj) == 0:  
 | 
            curTagObj.SetDict(ChConfig.Def_PlayerKey_LastHurt, curObj.GetPlayerID())  
 | 
          
 | 
        curTeam = curObj.GetTeam()  
 | 
          
 | 
        #2012-04-23 jiang ¹¥»÷ïÚ³µÖ»Ëã¸öÈËÉ˺¦  
 | 
        if curTagObj.GetGameObjType() == IPY_GameWorld.gotNPC and \  
 | 
           curTagObj.GetGameNPCObjType() == IPY_GameWorld.gnotTruck or curTeam == None:  
 | 
            #ÎÞ¶ÓÎé,Ìí¼Ó¸öÈËÉ˺¦  
 | 
            AddHurtValue(curTagObj, curObj.GetPlayerID(), ChConfig.Def_NPCHurtTypePlayer, hurtHP)  
 | 
            return True  
 | 
                  
 | 
        #Ìí¼Ó¶ÓÎéÉ˺¦  
 | 
        AddHurtValue(curTagObj, curTeam.GetTeamID(), ChConfig.Def_NPCHurtTypeTeam, hurtHP)  
 | 
        #Ìí¼Ó¶ÓÎé³ÉÔ±É˺¦£¬ÓÃÓÚ¹¦ÄÜͳ¼Æ¶ÓÔ±É˺¦  
 | 
        AddTeamPlayerHurtValue(curTagObj, curTeam.GetTeamID(), curObj.GetPlayerID(), hurtHP)  
 | 
          
 | 
    elif curObjType == IPY_GameWorld.gotNPC:  
 | 
        AddHurtValue(curTagObj, curObj.GetID(), ChConfig.Def_NPCHurtTypeNPC, hurtHP)  
 | 
          
 | 
    else:  
 | 
        GameWorld.ErrLog('NPCAddObjInHurtList UnKnow ObjType = %s' % (curObjType))  
 | 
  
 | 
    return True  
 | 
  
 | 
## PVPÉ˺¦  
 | 
#  @remarks Íæ¼Ò½ÇÉ«¼°³èÎï¡¢ÕÙ»½ÊÞÖ®¼ä²úÉúµÄÉ˺¦¶¼ËãPVPÉ˺¦;   
 | 
#           Áí·´É˼°³ÖÐøµôѪbuffÒ²Ëã, µ«·´É˼°buff½ö¼ÆËãÍæ¼ÒÖ®¼ä  
 | 
def OnPVPDamage(curPlayer, damageValue, tagPlayer, damageMsg):  
 | 
    #GameWorld.DebugLog("%s curPlayerID(%sLVEX:%s)=%s,tagPlayerID(%sLVEX:%s)=%s,damageValue=%s"   
 | 
    #    % (damageMsg, curPlayer.GetAccID(), curPlayer.GetLVEx(), curPlayer.GetPlayerID(),   
 | 
    #       tagPlayer.GetAccID(), tagPlayer.GetLVEx(), tagPlayer.GetPlayerID(), damageValue))  
 | 
    FBLogic.OnPVPDamage(curPlayer, damageValue, tagPlayer)  
 | 
    return  
 | 
  
 | 
#--------------------------------------------------------------------------  
 | 
  
 | 
#--------¹¥»÷¶ÔÏóÅжÏ,¸øÄÚ²ãµ÷Óà  
 | 
  
 | 
## ¹¥»÷¶ÔÏó,ͨÓÃÅжϠ  
 | 
#  @param attacker ¹¥»÷·½  
 | 
#  @param defender ·ÀÊØ·½  
 | 
#  @return True or False  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckCanAttackTag(attacker, defender):  
 | 
      
 | 
    if not CheckIsAvailableTag(attacker, defender):  
 | 
        return False  
 | 
      
 | 
    if not defender.GetCanAttack():  
 | 
        #Õâ¸ö¶ÔÏ󲻿ɹ¥»÷  
 | 
        #GameWorld.Log("defender = %s->%s Õâ¸ö¶ÔÏ󲻿ɹ¥»÷"%(defender.GetName(),defender.GetID()))  
 | 
        return False  
 | 
      
 | 
    atkObjType = attacker.GetGameObjType()  
 | 
    defObjType = defender.GetGameObjType()  
 | 
    # Èç¹ûÊÇÍæ¼Ò ´ò NPC  
 | 
    if atkObjType == IPY_GameWorld.gotPlayer and defObjType == IPY_GameWorld.gotNPC:  
 | 
        ##¹¥»÷´ÎÊýÅÐ¶Ï  
 | 
        #if not CheckAttackNPCByCnt(attacker, defender):  
 | 
        #    return False  
 | 
          
 | 
        #»÷ɱ´ÎÊýÅÐ¶Ï  
 | 
        if not CheckKillNPCByCnt(attacker, defender):  
 | 
            return False  
 | 
          
 | 
        #ÏÉÃ˹éÊôNPCÅÐ¶Ï  
 | 
        if not CheckCanAttackFamilyOwnerNPC(attacker, defender):  
 | 
            return False  
 | 
          
 | 
    # NPC´òÍæ¼Ò£¬·´¹ýÀ´ÅÐ¶Ï  
 | 
    elif atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotPlayer:  
 | 
        ##¹¥»÷´ÎÊýÅÐ¶Ï  
 | 
        #if not CheckAttackNPCByCnt(defender, attacker, False):  
 | 
        #    return False  
 | 
          
 | 
        #»÷ɱ´ÎÊýÅÐ¶Ï  
 | 
        if not CheckKillNPCByCnt(defender, attacker, False):  
 | 
            return False  
 | 
          
 | 
        #ÏÉÃ˹éÊôNPCÅÐ¶Ï  
 | 
        if not CheckCanAttackFamilyOwnerNPC(defender, attacker, False):  
 | 
            return False  
 | 
          
 | 
    # NPC´òNPC  
 | 
    elif atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotNPC:  
 | 
        if PetControl.IsPet(attacker) or attacker.GetGameNPCObjType()== IPY_GameWorld.gnotSummon:  
 | 
            #»÷ɱ´ÎÊýÅÐ¶Ï  
 | 
            if not CheckKillNPCByCnt(attacker, defender, False):  
 | 
                return False  
 | 
              
 | 
            #ÏÉÃ˹éÊôNPCÅÐ¶Ï  
 | 
            if not CheckCanAttackFamilyOwnerNPC(attacker, defender, False):  
 | 
                return False  
 | 
              
 | 
    #¹¥»÷NPCµÈ¼¶ÏÞÖÆ  
 | 
    #if not CheckCanAttackNPCByLV(attacker, defender):  
 | 
    #    return False  
 | 
      
 | 
    #²»¿É¹¥»÷ÇøÓò  
 | 
    if not CheckCanAtkByArea(attacker, defender):  
 | 
        return False  
 | 
  
 | 
    #ÑéÖ¤FBÖÐÊÇ·ñ¿É¹¥»÷, ¹¥»÷ºÍ³ðºÞÅжϻáµ÷Óøú¯Êý£¬Åж¨²»¿É¹¥»÷µÄÇé¿ö  
 | 
    if not FBLogic.CheckCanAttackTagObjInFB(attacker, defender):  
 | 
        return False  
 | 
      
 | 
    return True  
 | 
  
 | 
def CheckCanAttackNPCByLV(attacker, defender):  
 | 
    ''' Åжϵ±Ç°µÈ¼¶¿É·ñ¹¥»÷¸ÃNPC '''  
 | 
    if defender.GetGameObjType() != IPY_GameWorld.gotNPC:  
 | 
        #GameWorld.DebugLog("Ö»Åжϱ»¹¥»÷µÄÊÇNPCµÄÇé¿ö")  
 | 
        return True  
 | 
      
 | 
    npcID = defender.GetNPCID()  
 | 
    attackLVLimitDict = ReadChConfig.GetEvalChConfig("AttackNPCLVLimit")  
 | 
    if npcID not in attackLVLimitDict:  
 | 
        #GameWorld.DebugLog("ÎÞ¹¥»÷µÈ¼¶ÏÞÖÆµÄNPC, npcID=%s" % npcID)  
 | 
        return True  
 | 
      
 | 
    minLV, maxLV = attackLVLimitDict[npcID]  
 | 
    atkPlayer, npcObjType = GetAttackPlayer(attacker)  
 | 
    # ¹¥»÷Õß·ÇÍæ¼Ò²»ÏÞÖÆ  
 | 
    if not atkPlayer:  
 | 
        #GameWorld.DebugLog("¹¥»÷Õß·ÇÍæ¼Ò²»ÏÞÖÆ")  
 | 
        return True  
 | 
      
 | 
    judgeMaxLV = maxLV if maxLV > 0 else 99999  
 | 
    if minLV <= atkPlayer.GetLV() <= judgeMaxLV:  
 | 
        #GameWorld.DebugLog("Íæ¼Ò¹¥»÷NPCµÈ¼¶Ìõ¼þÂú×ã!")  
 | 
        return True  
 | 
      
 | 
    # Êµ¼Ê¹¥»÷ÕßÀàÐÍNoneÔòÐèÒªÌáÊ¾Íæ¼Ò  
 | 
    if npcObjType is None:  
 | 
        if minLV > 0 and maxLV > 0:  
 | 
            PlayerControl.NotifyCode(atkPlayer, "GeRen_liubo_689354", [minLV, maxLV])  
 | 
        elif minLV > 0:  
 | 
            PlayerControl.NotifyCode(atkPlayer, "GeRen_liubo_198823", [minLV - 1])  
 | 
        elif maxLV > 0:  
 | 
            PlayerControl.NotifyCode(atkPlayer, "GeRen_liubo_437659", [maxLV + 1])  
 | 
    #else:  
 | 
    #    GameWorld.DebugLog("³èÎï/ÕÙ»½ÊÞ¹¥»÷NPCµÈ¼¶ÊÜÏÞ!ÎÞ·¨Ôì³ÉÉ˺¦!")  
 | 
                
 | 
    return False  
 | 
  
 | 
def CheckCanAttackFamilyOwnerNPC(attacker, defender, isNotify=True):  
 | 
    ''' ÅжϿɷñ¹¥»÷ÏÉÃ˹éÊôµÄNPC '''  
 | 
    if defender.GetGameObjType() != IPY_GameWorld.gotNPC:  
 | 
        #GameWorld.DebugLog("Ö»Åжϱ»¹¥»÷µÄÊÇNPCµÄÇé¿ö")  
 | 
        return True  
 | 
      
 | 
    if NPCCommon.GetDropOwnerType(defender) != ChConfig.DropOwnerType_Family:  
 | 
        return True  
 | 
      
 | 
    atkPlayer, npcObjType = GetAttackPlayer(attacker)  
 | 
    # ¹¥»÷Õß·ÇÍæ¼Ò²»ÏÞÖÆ  
 | 
    if not atkPlayer:  
 | 
        #GameWorld.DebugLog("¹¥»÷Õß·ÇÍæ¼Ò²»ÏÞÖÆ")  
 | 
        return True  
 | 
      
 | 
    atkLimitNotifyMark = ""  
 | 
    if GetIsNewGuy(atkPlayer):  
 | 
        atkLimitNotifyMark = "FairyGrabBossNotAtk"  
 | 
    elif not atkPlayer.GetFamilyID():  
 | 
        atkLimitNotifyMark = "FairyGrabBossNoFairy"  
 | 
          
 | 
    if atkLimitNotifyMark:  
 | 
        if npcObjType is None and isNotify:  
 | 
            PlayerControl.NotifyCode(atkPlayer, atkLimitNotifyMark)  
 | 
        return False  
 | 
      
 | 
    return True  
 | 
  
 | 
def CheckKillNPCByCnt(attacker, defender, isNotify=True):  
 | 
    ''' Åжϵ±ÈÕ»÷ɱ¸ÃNPC´ÎÊýÊÇ·ñÒÑÂú '''  
 | 
    if defender.GetGameObjType() != IPY_GameWorld.gotNPC:  
 | 
        #GameWorld.DebugLog("Ö»Åжϱ»¹¥»÷µÄÊÇNPCµÄÇé¿ö")  
 | 
        return True  
 | 
    if not ChConfig.IsGameBoss(defender):  
 | 
        return True  
 | 
    npcID = defender.GetNPCID()  
 | 
    killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit')   
 | 
    index = GameWorld.GetDictValueByKey(killBossCntLimitDict, npcID)  
 | 
    if index == None:  
 | 
        return True  
 | 
      
 | 
    atkPlayer, npcObjType = GetAttackPlayer(attacker)  
 | 
    # ¹¥»÷Õß·ÇÍæ¼Ò²»ÏÞÖÆ  
 | 
    if not atkPlayer:  
 | 
        #GameWorld.DebugLog("¹¥»÷Õß·ÇÍæ¼Ò²»ÏÞÖÆ")  
 | 
        return True  
 | 
    funcInfoDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 5, {})  
 | 
    if index in funcInfoDict:  
 | 
        #¶ÔÓ¦¹¦ÄÜ먦Æô£¬²»Äܹ¥»÷  
 | 
        funcID, funcSysMark = funcInfoDict[index]  
 | 
        if not GameFuncComm.GetFuncCanUse(atkPlayer, funcID):  
 | 
            PlayerControl.NotifyCode(atkPlayer, funcSysMark)  
 | 
            return  
 | 
  
 | 
    hasKillCnt = atkPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCnt%index, 0)  
 | 
    itemAddKillCnt = atkPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntItemAddCnt%index, 0)  
 | 
    killLimitPrivilege = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 4, {}).get(index, 0)  
 | 
    if killLimitPrivilege:  
 | 
        limitCnt = PlayerVip.GetPrivilegeValue(atkPlayer, killLimitPrivilege)  
 | 
    else:  
 | 
        limitCnt = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 2, {}).get(index, 0)  
 | 
      
 | 
      
 | 
    if hasKillCnt >= limitCnt + itemAddKillCnt:  
 | 
        #if BossHurtMng.GetPlayerBossHurt(atkPlayer, defender):  
 | 
        #    GameWorld.DebugLog("¹¥»÷¹ý¸Ãboss¿É¼ÌÐø¹¥»÷")  
 | 
        #    return True  
 | 
        #´ÎÊý²»×ã  
 | 
        # Êµ¼Ê¹¥»÷ÕßÀàÐÍNoneÔòÐèÒªÌáÊ¾Íæ¼Ò  
 | 
        if npcObjType is None:  
 | 
            if isNotify:  
 | 
                sysMark = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit', 3, {}).get(index, '')  
 | 
                PlayerControl.NotifyCode(atkPlayer, sysMark)  
 | 
        return False  
 | 
    return True  
 | 
  
 | 
  
 | 
def CheckAttackNPCByCnt(attacker, defender, isNotify=True):  
 | 
    ''' Åжϵ±ÈÕ¹¥»÷¸ÃNPC´ÎÊýÊÇ·ñÒÑÂú '''  
 | 
    if defender.GetGameObjType() != IPY_GameWorld.gotNPC:  
 | 
        #GameWorld.DebugLog("Ö»Åжϱ»¹¥»÷µÄÊÇNPCµÄÇé¿ö")  
 | 
        return True  
 | 
    if not ChConfig.IsGameBoss(defender):  
 | 
        return True  
 | 
      
 | 
    limitBossIDList, limitCnt = ReadChConfig.GetEvalChConfig("AttackBossCntLimit")  
 | 
    npcID = defender.GetNPCID()  
 | 
    if npcID not in limitBossIDList:  
 | 
        return True  
 | 
      
 | 
    atkPlayer, npcObjType = GetAttackPlayer(attacker)  
 | 
    # ¹¥»÷Õß·ÇÍæ¼Ò²»ÏÞÖÆ  
 | 
    if not atkPlayer:  
 | 
        #GameWorld.DebugLog("¹¥»÷Õß·ÇÍæ¼Ò²»ÏÞÖÆ")  
 | 
        return True  
 | 
      
 | 
    hasAttackCnt = atkPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WorldBoss_HurtCnt, 0)  
 | 
      
 | 
    if hasAttackCnt >= limitCnt:  
 | 
        #if BossHurtMng.GetPlayerBossHurt(atkPlayer, defender):  
 | 
        #    GameWorld.DebugLog("¹¥»÷¹ý¸Ãboss¿É¼ÌÐø¹¥»÷")  
 | 
        #    return True  
 | 
        #´ÎÊý²»×ã  
 | 
        # Êµ¼Ê¹¥»÷ÕßÀàÐÍNoneÔòÐèÒªÌáÊ¾Íæ¼Ò  
 | 
        if npcObjType is None:  
 | 
            if isNotify:  
 | 
                PlayerControl.NotifyCode(atkPlayer, "GeRen_liubo_759061")  
 | 
        return False  
 | 
    return True  
 | 
  
 | 
def GetAttackPlayer(atkObj):  
 | 
    ''' »ñÈ¡¹¥»÷ÕßËùÊôÍæ¼ÒʵÀý  
 | 
    @return:  
 | 
             µ±Êµ¼Ê¹¥»÷ÕßÎªÍæ¼Òʱ£¬·µ»Ø [curPlayer, None]   
 | 
             µ±Êµ¼Ê¹¥»÷ÕßÊÇÆÕͨNPCʱ£¬·µ»Ø [None, None]  
 | 
             µ±Êµ¼Ê¹¥»÷ÕßÊdzèÎï»òÕÙ»½ÊÞʱ£¬·µ»Ø [Ö÷ÈËcurPlayer, npcObjType]  
 | 
    '''  
 | 
      
 | 
    atkObjType = atkObj.GetGameObjType()  
 | 
    # Èç¹ûÊÇÍæ¼Ò  
 | 
    if atkObjType == IPY_GameWorld.gotPlayer:  
 | 
        return atkObj, None  
 | 
      
 | 
    npcObjType = atkObj.GetGameNPCObjType()  
 | 
    # ÅжÏÕÙ»½ÊÞÖ÷ÈË  
 | 
    if npcObjType == IPY_GameWorld.gnotSummon:  
 | 
        curNPCDetail = GameWorld.GetObjDetail(atkObj)  
 | 
        if curNPCDetail:  
 | 
            curNPCOwner = curNPCDetail.GetOwner()  
 | 
            if curNPCOwner:  
 | 
                summonOwner = GameWorld.GetObjDetail(curNPCOwner)  
 | 
                # ÕÙ»½ÊÞÖ÷ÈËÎªÍæ¼Ò  
 | 
                if summonOwner and summonOwner.GetGameObjType() == IPY_GameWorld.gotPlayer:  
 | 
                    return summonOwner, npcObjType  
 | 
              
 | 
    # ÅжϳèÎïÖ÷ÈË  
 | 
    elif npcObjType == IPY_GameWorld.gnotPet:  
 | 
        ownerPlayer = PetControl.GetPetOwner(atkObj)  
 | 
        if ownerPlayer != None:  
 | 
            return ownerPlayer, npcObjType  
 | 
          
 | 
    return None, None  
 | 
  
 | 
##¼ì²é¶ÔÏóÊÇ·ñÔÚ°²È«ÇøÖУ¬Ä¿Ç°Ö»´¦ÀíÍæ¼Ò  
 | 
# @param None  
 | 
# @return None  
 | 
def CheckCanAtkByArea(curObj, tagObj):  
 | 
    areaType = GameMap.GetAreaTypeByMapPos(curObj.GetPosX(), curObj.GetPosY())  
 | 
    tagAreaType = GameMap.GetAreaTypeByMapPos(tagObj.GetPosX(), tagObj.GetPosY())  
 | 
      
 | 
    #×ÔÓÉÇøÓò£¬ºÏ·¨£¬·µ»ØTrue  
 | 
    if areaType == IPY_GameWorld.gatSafe or tagAreaType == IPY_GameWorld.gatSafe:         
 | 
        return False  
 | 
      
 | 
    #²»Í¬ÇøÓò  
 | 
    #if areaType != tagAreaType:  
 | 
    #    return False  
 | 
      
 | 
    return True  
 | 
  
 | 
  
 | 
## ¹¥»÷¶ÔÏó, ÓÐЧĿ±ê  
 | 
#  @param attacker ¹¥»÷·½  
 | 
#  @param defender ·ÀÊØ·½  
 | 
#  @return True or False  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckIsAvailableTag(attacker, defender):  
 | 
    if defender == None or defender.GetID() == 0:  
 | 
        return False  
 | 
    if GameObj.GetHP(attacker) <= 0 or GameObj.GetHP(defender) <= 0 :  
 | 
        #¶ÔÏóÒѾËÀÍö  
 | 
        return False  
 | 
      
 | 
    #Ìí¼Ó£¨ÏµÍ³£©ÒþÉíÕß²»¿É¹¥»÷£¬Ö¤Ã÷¼Ò×åÕ½·ÇÒþÉí  
 | 
    if not attacker.GetVisible():  
 | 
        return False  
 | 
      
 | 
    if not defender.GetVisible():  
 | 
        return False  
 | 
      
 | 
    return True  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##¼ì²é¶ÔÏóÊÇ·ñ¿ÉÒÔ¹¥»÷(Obj¸¸Àà·½·¨)  
 | 
# @param curObj ¼ì²é¶ÔÏó  
 | 
# @return ²¼¶ûÖµ  
 | 
# @remarks ¼ì²é¶ÔÏóÊÇ·ñ¿ÉÒÔ¹¥»÷(Obj¸¸Àà·½·¨)  
 | 
def CheckObjCanDoLogic(curObj):  
 | 
    #Ò쳣״̬  
 | 
    if curObj == None or curObj.GetID() == 0:  
 | 
        return False  
 | 
      
 | 
    #ËÀÍö״̬  
 | 
    if GameObj.GetHP(curObj) <= 0:  
 | 
        return False  
 | 
      
 | 
    #·ÇÕý³£×´Ì¬(ÒþÐÎ)  
 | 
    if not curObj.GetVisible():  
 | 
        return False  
 | 
      
 | 
    return True  
 | 
#---------------------------------------------------------------------  
 | 
## Íæ¼Ò¹¥»÷¶ÔÏó,ͨÓÃÅжϠ  
 | 
#  @param attacker µ±Ç°Íæ¼Ò  
 | 
#  @param defender ·ÀÊØ·½  
 | 
#  @return True or False  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckPlayerCanAttackTag(curPlayer, defender):  
 | 
    if not CheckCanAttackTag(curPlayer, defender):  
 | 
        curPlayer.Notify_AttackFail(  
 | 
                                     defender.GetID() ,  
 | 
                                     defender.GetGameObjType() ,  
 | 
                                     defender.GetPosX() ,  
 | 
                                     defender.GetPosY() ,  
 | 
                                     IPY_GameWorld.afrNull  
 | 
                                     )  
 | 
        return False  
 | 
      
 | 
#===============================================================================  
 | 
#    #»ñµÃµ±Ç°µØÍ¼  
 | 
#    curMap = GameWorld.GetMap()  
 | 
#    #ÅжÁ¹¥»÷ÊÇ·ñ¿ÉÒÔµ½´ï  
 | 
#    if not curMap.CanJumpTo( curPlayer.GetPosX(), curPlayer.GetPosY(),  
 | 
#                         defender.GetPosX(), defender.GetPosY(),  
 | 
#                         ChConfig.Def_PlayerCanAttackBalk ):  
 | 
#        curPlayer.Notify_AttackFail(IPY_GameWorld.afrHaveObs)  
 | 
#        return False  
 | 
#===============================================================================  
 | 
    if curPlayer.GetPlayerAction() not in ChConfig.Def_PlayerCanAttackState:  
 | 
        return False  
 | 
      
 | 
    #ÊÇ·ñÆï³Ë  
 | 
    #===========================================================================  
 | 
    # if curPlayer.GetPlayerVehicle() != IPY_GameWorld.pvNull:  
 | 
    #    return False  
 | 
    #===========================================================================  
 | 
      
 | 
#===============================================================================  
 | 
#    if not ItemControler.CheckAttackConsumeArrow(curPlayer, True):  
 | 
#        #Èç¹ûÓùåó,ÊÇ·ñÓÐ×Óµ¯  
 | 
#        return False  
 | 
#===============================================================================  
 | 
    return True  
 | 
  
 | 
## ¼ì²éÍæ¼Ò¹¥»÷¾àÀë   
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param curTag µ±Ç°¶ÔÏó  
 | 
#  @param useSkill Ê¹Óõļ¼ÄÜ(ÎÞ->´«ÈëNone)  
 | 
#  @return True or False  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckPlayerAttackDist(curPlayer, curTag, useSkill):  
 | 
    #¹¥»÷ÆðµãÈ¡»º´æµÄ×ø±ê  
 | 
    atkStartPosX = curPlayer.GetAttackTargetPosX()  
 | 
    atkStartPosY = curPlayer.GetAttackTargetPosY()  
 | 
      
 | 
    #ÅжϾàÀë, µ±Çл»µØÍ¼Íæ¼Òδ¹¥»÷±»¶¯Êͷż¼ÄÜʱ£¬¾àÀë²»¶ÔÎÞ·¨¹¥»÷  
 | 
    dist = min(GameWorld.GetDist(atkStartPosX, atkStartPosY, curTag.GetPosX(), curTag.GetPosY()),  
 | 
               GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), curTag.GetPosX(), curTag.GetPosY()))  
 | 
  
 | 
    #ÆÕͨ¹¥»÷Óü¼ÄÜʵÏÖ  
 | 
    if not useSkill:  
 | 
        return True  
 | 
      
 | 
    #¼¼Äܹ¥»÷( ÓÐÈÝ´í¾àÀë )  
 | 
    skillDist = useSkill.GetAtkDist()  
 | 
    if skillDist == 0:  
 | 
        return True  
 | 
      
 | 
    skillDist += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(curPlayer, curTag, useSkill, ChConfig.TriggerType_SkillDist)  
 | 
    if dist > skillDist + ChConfig.Def_PlayerAttackDistZoom:  
 | 
        #PlayerControl.NotifyCode(curPlayer, "XW_SF_DistanceFarness")  
 | 
        #GameWorld.GodLog(curPlayer, '¼¼ÄܾàÀ볬Զ = %s, ¼¼Äܹ¥»÷¾àÀë = %s'%( dist, skillDist ))  
 | 
        return False  
 | 
      
 | 
    return True  
 | 
  
 | 
  
 | 
## NPC¹¥»÷¶ÔÏó,ͨÓÃÅÐ¶Ï  
 | 
#  @param curNPC µ±Ç°NPC  
 | 
#  @param defender ·ÀÊØ·½  
 | 
#  @param skill Ê¹Óõļ¼ÄÜ(ÎÞ->´«ÈëNone)  
 | 
#  @return True or False  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckNPCCanAttackTag(curNPC, defender, skill):  
 | 
    if not CheckCanAttackTag(curNPC, defender):  
 | 
        #GameWorld.Log("NPC¹¥»÷²»Âú×ãͨÓÃÌõ¼þ")  
 | 
        return False  
 | 
      
 | 
    if not CheckNPCAttackDist(curNPC, defender, skill):  
 | 
        return False  
 | 
      
 | 
    #NPC¹¥»÷ÅжÏ:ÎÞ·¨¹¥»÷×Ô¼º,°üÀ¨¶Ô×Ô¼ºÊ¹Óü¼ÄÜ»òBuff  
 | 
    if GameWorld.IsSameObj(curNPC, defender):  
 | 
        return False  
 | 
      
 | 
    return True  
 | 
  
 | 
## ¼ì²éNPC¹¥»÷¾àÀë(µ±Ç°NPC,µ±Ç°¶ÔÏó,ʹÓõļ¼ÄÜ(ÎÞ->´«ÈëNone))  
 | 
#  @param curNPC µ±Ç°NPC  
 | 
#  @param curTag µ±Ç°¶ÔÏó  
 | 
#  @param skill Ê¹Óõļ¼ÄÜ(ÎÞ->´«ÈëNone)  
 | 
#  @return True or False  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckNPCAttackDist(curNPC, curTag, skill):  
 | 
    #»ñÈ¡¾àÀë  
 | 
    dist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(),  
 | 
                             curTag.GetPosX(), curTag.GetPosY())  
 | 
    #ÆÕͨ¹¥»÷  
 | 
    if skill == None:  
 | 
        if dist > curNPC.GetAtkDist():  
 | 
            return  
 | 
    #¼¼Äܹ¥»÷  
 | 
    elif dist > skill.GetAtkDist():  
 | 
        return  
 | 
      
 | 
    return True  
 | 
  
 | 
## ¼ì²é±»¹¥»÷ºó,ÌØÊâBuffÏûʧ  
 | 
#  @param curTagPlayer ±»¹¥»÷·½  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def SuperAttackedBuff(curTagPlayer):  
 | 
    return  
 | 
#--------------------------------------------------------------------------  
 | 
  
 | 
#-----------ÌØÊâÀàÐͼ¼ÄÜÅÐ¶Ï  
 | 
## ¸´»î¼¼ÄÜÅжϠ  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param curTag µ±Ç°¶ÔÏó  
 | 
#  @param skill ¼¼ÄÜ  
 | 
#  @return True or False  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckSkill_ReBorn(curPlayer, curTag, skill):  
 | 
    if curTag == None or curTag.GetID() == 0:  
 | 
        #¶ÔÏóÒÑÏûʧ  
 | 
        return False  
 | 
      
 | 
    if curTag.GetGameObjType() != IPY_GameWorld.gotPlayer:  
 | 
        #GameWorld.Log("ÎÞ·¨¶Ô·ÇÍæ¼Ò¶ÔÏóʹÓø´»î¼¼ÄÜ")  
 | 
        return False  
 | 
      
 | 
    if not GameWorld.IsSameCountry(curPlayer, curTag):  
 | 
        #GameWorld.Log("ÎÞ·¨¶Ô·Ç±¾¹úÍæ¼ÒʹÓø´»î¼¼ÄÜ")  
 | 
        return False  
 | 
      
 | 
    if GameObj.GetHP(curTag) > 0:  
 | 
        #GameWorld.Log("ÎÞ·¨¶ÔÉúÃü!=0µÄÍæ¼ÒʹÓø´»î¼¼ÄÜ")  
 | 
        return False  
 | 
      
 | 
    if not CheckPlayerAttackDist(curPlayer, curTag, skill):  
 | 
        #¹¥»÷̫Զ  
 | 
        return False  
 | 
      
 | 
    if CheckPlayerAttackMode_Player(curPlayer, curTag):  
 | 
        #GameWorld.Log("ÎÞ·¨¸´»îµÐ¶ÔÍæ¼Ò")  
 | 
        return False  
 | 
      
 | 
    return True  
 | 
  
 | 
  
 | 
## ÏÉÁÆÊõ (->Ö»ÄܶÔ×Ô¼ºµÄ¶ÓԱʹÓÃ)   
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @param curTag µ±Ç°¶ÔÏó  
 | 
#  @param skill ¼¼ÄÜ  
 | 
#  @return True or False  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def CheckSkill_Team(curPlayer, curTag, skill):  
 | 
    if curTag == None or curTag.GetID() == 0:  
 | 
        #¶ÔÏóÒÑÏûʧ  
 | 
        return False  
 | 
      
 | 
    #¿ÉÒÔ¶Ô×Ô¼ºÊ¹Óà  
 | 
    if GameWorld.IsSameObj(curPlayer, curTag) :  
 | 
        return True  
 | 
      
 | 
    if curTag.GetGameObjType() != IPY_GameWorld.gotPlayer:  
 | 
        return False  
 | 
      
 | 
    if GameObj.GetHP(curTag) == 0:  
 | 
        return False  
 | 
      
 | 
    if not CheckPlayerAttackDist(curPlayer, curTag, skill):  
 | 
        #¹¥»÷̫Զ  
 | 
        return False  
 | 
      
 | 
    if CheckPlayerAttackMode_Player(curPlayer, curTag):  
 | 
        #GameWorld.Log("¿ÉÒÔ¹¥»÷,ÎÞ·¨Ê¹ÓÃÖÎÁÆ")  
 | 
        return False  
 | 
      
 | 
    curTagTeam = curTag.GetTeam()  
 | 
    curPlayerTeam = curPlayer.GetTeam()  
 | 
    if curPlayerTeam == None or curTagTeam == None :  
 | 
        return False  
 | 
      
 | 
    return curTagTeam.GetTeamID() == curPlayerTeam.GetTeamID()  
 | 
  
 | 
#===============================================================================  
 | 
# #------------------  
 | 
# ## É˺¦½á¹¹Ìå  
 | 
# (  
 | 
# Def_HurtType_Normal,   
 | 
# Def_HurtType_SuperHit,   
 | 
# Def_HurtType_Miss,   
 | 
# ) = range(0, 3)  
 | 
# #ÀàÐÍ: 0-ÆÕͨ 1-ÖÂÃüÒ»»÷ 2-¶ãÉÁ  
 | 
#===============================================================================  
 | 
  
 | 
## É˺¦½á¹¹ÌåÀà  
 | 
#  
 | 
#  PyClassÀàµÄÏêϸ˵Ã÷.  
 | 
class HurtType:  
 | 
    HurtHP = 0  
 | 
    HurtType = 0  
 | 
    ## ³õʼ»¯º¯Êý  
 | 
    #  @param hurtHP ÉËѪֵ  
 | 
    #  @param hurtType ÉËѪÀàÐÍ  
 | 
    #  @return None  
 | 
    #  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
    def __init__(self):  
 | 
        self.HurtHP = 0    #NPCÈ¡É˺¦Öµ£¬Íæ¼ÒÈ¡µôѪֵ£¬ÔÂß¼²»ÐÞ¸Ä  
 | 
        self.HurtType = 0  
 | 
        self.LostHP = 0     #µôѪֵ  
 | 
        self.RealHurtHP = 0 #É˺¦Öµ  
 | 
          
 | 
#####################################  
 | 
  
 | 
##Åж¨ÊÇ·ñ´¥·¢¼¼Äܱط¢Éú״̬  
 | 
# @param happenState ¼¼ÄÜ·¢Éú̬  
 | 
# @param cmpType ×´Ì¬¶Ô±ÈÖµ  
 | 
# @return ±È½Ï½á¹û  
 | 
def IsHappenStateByType(happenState, cmpType):  
 | 
    return happenState & cmpType  
 | 
  
 | 
def CalcHurtTypeResult(atkObj, defObj, atkObjType, defObjType, happenState):  
 | 
    ''' »ñÈ¡É˺¦ÀàÐͽá¹û   
 | 
    Ö§³Ö¶àÖÖÉ˺¦ÀàÐÍͬʱ´¥·¢, Æ®×Ö±íÏÖÒÔ×îÖÕ±íÏÖÉ˺¦ÀàÐÍΪÖ÷  
 | 
    @return: ×îÖÕ±íÏÖÉ˺¦ÀàÐÍ, {É˺¦ÀàÐÍ:[ÊÇ·ñ´¥·¢, É˺¦¼ÆËãÖµ, ´¥·¢Ê±·ÀÊØ·½µÄÉ˺¦¼õÃâÖµ], ...}  
 | 
    '''  
 | 
    hurtType = ChConfig.Def_HurtType_Normal  
 | 
    # É˺¦ÀàÐͽá¹ûÐÅÏ¢, Ä¬ÈÏÖµ{É˺¦ÀàÐÍ:[ÊÇ·ñ´¥·¢, É˺¦¼ÆËãÖµ, ´¥·¢Ê±·ÀÊØ·½µÄÉ˺¦¼õÃâÖµ], ...}  
 | 
    hurtTypeResultDict = {  
 | 
                          ChConfig.Def_HurtType_LuckyHit:[False, 0, 0],  
 | 
                          ChConfig.Def_HurtType_SuperHit:[False, 0, 0],  
 | 
                          ChConfig.Def_HurtType_Parry:[False, 0, 0],  
 | 
                          }  
 | 
      
 | 
    calcTypeList =  []  
 | 
    if atkObjType == IPY_GameWorld.gotPlayer:  
 | 
        calcTypeList += [ChConfig.Def_HurtType_LuckyHit, ChConfig.Def_HurtType_SuperHit]  
 | 
    if defObjType == IPY_GameWorld.gotPlayer:  
 | 
        calcTypeList += [ChConfig.Def_HurtType_Parry]  
 | 
    # ÔÝʱֻ¼ÆËãÍæ¼Ò  
 | 
    if not calcTypeList:  
 | 
        return hurtType, hurtTypeResultDict  
 | 
      
 | 
    # ÓÅÏȼ¶Áбí, »¥³âÁÐ±í  
 | 
    priorityList, mutexList = ReadChConfig.GetEvalChConfig("CalcHurtTypeInfo")  
 | 
    happenFunc = {  
 | 
                  ChConfig.Def_HurtType_LuckyHit:lambda aObj, dObj, hState:__HurtTypeHappen_LuckyHit(aObj, dObj, hState),  
 | 
                  ChConfig.Def_HurtType_SuperHit:lambda aObj, dObj, hState:__HurtTypeHappen_SuperHit(aObj, dObj, hState),  
 | 
                  ChConfig.Def_HurtType_Parry:lambda aObj, dObj, hState:__HurtTypeHappen_Parry(aObj, dObj, hState),  
 | 
                  }  
 | 
      
 | 
    hadCheckList = [] # ÒѾ´¦Àí¹ýµÄÉ˺¦ÀàÐÍÁÐ±í  
 | 
    # ÏȼÆË㻥³â±íÀï  
 | 
    for mutexHurtTypeList in mutexList:  
 | 
        curMHHappen = False # µ±Ç°»¥³âÁбíÊÇ·ñÓд¥·¢µÄ  
 | 
        for hType in mutexHurtTypeList:  
 | 
            if hType not in calcTypeList:  
 | 
                continue  
 | 
            if hType in hadCheckList:  
 | 
                continue  
 | 
              
 | 
            hadCheckList.append(hType)  
 | 
            if curMHHappen:  
 | 
                # Ö»ÒªÆäÖÐÒ»¸öÒÑ´¥·¢µÄÔòºóÃæµÄ¾ùΪĬÈϲ»´¥·¢  
 | 
                continue  
 | 
            result = happenFunc[hType](atkObj, defObj, happenState)  
 | 
            if result: # Èç¹û´¥·¢£¬¸üÐÂÏà¹ØÊýÖµ  
 | 
                hurtTypeResultDict[hType] = result  
 | 
                curMHHappen = True  
 | 
              
 | 
    # ÔÙËãÓÅÏȼ¶ÁбíÀï  
 | 
    for hType in priorityList:  
 | 
        if hType not in calcTypeList:  
 | 
            continue  
 | 
        if hType not in hadCheckList:  
 | 
            hadCheckList.append(hType)  
 | 
            result = happenFunc[hType](atkObj, defObj, happenState)  
 | 
            if result: # Èç¹û´¥·¢£¬¸üÐÂÏà¹ØÊýÖµ  
 | 
                hurtTypeResultDict[hType] = result  
 | 
                  
 | 
        # ×îÖÕÉ˺¦ÀàÐÍΪ°´ÓÅÏȼ¶È¡µÚÒ»¸ö´¥·¢µÄ  
 | 
        if hurtTypeResultDict[hType][0] and hurtType == ChConfig.Def_HurtType_Normal:  
 | 
            hurtType = hType  
 | 
              
 | 
    return hurtType, hurtTypeResultDict  
 | 
  
 | 
  
 | 
def __HurtTypeHappen_LuckyHit(atkObj, defObj, happenState):  
 | 
    ''' ÅжÏÉ˺¦ÀàÐÍÊÇ·ñ·¢Éú - ÐÒÔËÒ»»÷  
 | 
    @return: ÊÇ·ñ´¥·¢, ´¥·¢Ê±É˺¦¼ÆËãÖµ, ´¥·¢Ê±·ÀÊØ·½µÄÉ˺¦¼õÃâÖµ  
 | 
    '''  
 | 
    if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_LuckyHit):  
 | 
        return True, atkObj.GetLuckyHitVal(), PlayerControl.GetLuckyHitReducePer(defObj)  
 | 
      
 | 
    aLuckyHitRate = atkObj.GetLuckyHitRate()  
 | 
    dLuckyHitRateReduce = PlayerControl.GetLuckyHitRateReduce(defObj)  
 | 
      
 | 
  
 | 
    atkLuckyHitRate = eval(ReadChConfig.GetChConfig("CalcLuckyHitRate"))  
 | 
    if atkLuckyHitRate <= 0:  
 | 
        return  
 | 
    if GameWorld.CanHappen(atkLuckyHitRate):  
 | 
        return True, atkObj.GetLuckyHitVal(), PlayerControl.GetLuckyHitReducePer(defObj)  
 | 
    return  
 | 
  
 | 
def __HurtTypeHappen_SuperHit(atkObj, defObj, happenState):  
 | 
    ''' ÅжÏÉ˺¦ÀàÐÍÊÇ·ñ·¢Éú - ±©»÷  
 | 
    @return: ÊÇ·ñ´¥·¢, ´¥·¢Ê±É˺¦¼ÆËãÖµ, ´¥·¢Ê±·ÀÊØ·½µÄÉ˺¦¼õÃâÖµ  
 | 
    '''  
 | 
      
 | 
    if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_SuperHit):  
 | 
        return True, atkObj.GetSuperHit(), PlayerControl.GetSuperHitReducePer(defObj)  
 | 
      
 | 
    aSuperHitRate = atkObj.GetSuperHitRate()  
 | 
    dSuperHitRateReduce = PlayerControl.GetSuperHitRateReduce(defObj)  
 | 
    superHitRate = eval(ReadChConfig.GetChConfig("CalcSuperHitRate"))  
 | 
    superHitRate += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, None,   
 | 
                                                                       ChConfig.TriggerType_Buff_AddSuperHitRate)  
 | 
    if superHitRate <= 0:  
 | 
        return  
 | 
    if GameWorld.CanHappen(superHitRate):  
 | 
        return True, atkObj.GetSuperHit(), PlayerControl.GetSuperHitReducePer(defObj)  
 | 
    return  
 | 
  
 | 
def __HurtTypeHappen_Parry(atkObj, defObj, happenState):  
 | 
    ''' ÅжÏÉ˺¦ÀàÐÍÊÇ·ñ·¢Éú - ·ÀÊØ·½µÖÓù  
 | 
    @return: ÊÇ·ñ´¥·¢, ´¥·¢Ê±É˺¦¼ÆËãÖµ, ´¥·¢Ê±·ÀÊØ·½µÄÉ˺¦¼õÃâÖµ  
 | 
    '''  
 | 
    chanceDefPer = PlayerControl.GetDamChanceDef(defObj)  
 | 
    if not chanceDefPer:  
 | 
        return  
 | 
    if GameWorld.CanHappen(ChConfig.Def_ChanceDefRate):  
 | 
        return True, 0, chanceDefPer  
 | 
    return  
 | 
  
 | 
  
 | 
# ¸Ä±ä¼¼ÄÜÉ˺¦£¨Ð§¹ûID1010£©, Ò°ÍâС¹Ö1009Ìæ»»1010É˺¦(2018-03-07Ôö¼Ó¾«Ó¢¹Ö)  
 | 
def ChangeSkillHurt(curPlayer, defObj, curSkill, skillPer, skillValue):  
 | 
      
 | 
    findEffect = GetCanChangeSkillHurtEffect(curPlayer, defObj, curSkill)  
 | 
    if not findEffect:  
 | 
  
 | 
        return skillPer, skillValue  
 | 
  
 | 
    return findEffect.GetEffectValue(0) / float(ChConfig.Def_MaxRateValue), findEffect.GetEffectValue(1)  
 | 
  
 | 
# ¶ÔNPCÉ˺¦µÄÌØÊâ´¦Àí£¬ÎªÖ¸¶¨É˺¦Ìæ»» ·Ç¶îÍâ¼ÓÉ˺¦  
 | 
# 1. ¶Ô·ÇBOSS¹ÖµÄÌØÊâÉ˺¦ 2.¶ÔXXϵ¹ÖÎïµÄÌØÊâÉ˺¦  
 | 
def GetCanChangeSkillHurtEffect(attacker, defObj, curSkill):  
 | 
    if not curSkill:  
 | 
        return  
 | 
    if defObj.GetGameObjType() != IPY_GameWorld.gotNPC:  
 | 
        return  
 | 
      
 | 
    if attacker.GetGameObjType() == IPY_GameWorld.gotNPC and attacker.GetType() == IPY_GameWorld.ntMonster:  
 | 
        # ÆÕͨ¹ÖÎÞ´ËЧ¹û  
 | 
        return  
 | 
      
 | 
    if defObj.GetIsBoss() > ChConfig.Def_NPCType_Ogre_Super:  
 | 
        return  
 | 
      
 | 
    if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull and \  
 | 
    GameWorld.GetMap().GetMapID() not in IpyGameDataPY.GetFuncEvalCfg('SkillXPAddByFB', 1):  
 | 
        return  
 | 
      
 | 
    findEffect, effectID = GetSkillEffectByEffectIDs(curSkill, [ChConfig.Def_Skill_Effect_AttackReplace,  
 | 
                                                                            ChConfig.Def_Skill_Effect_AttackReplaceByNPCSeries])  
 | 
    if not findEffect:  
 | 
        return  
 | 
      
 | 
    if effectID == ChConfig.Def_Skill_Effect_AttackReplace:  
 | 
        # ¶ÔС¹ÖºÍ¾«Ó¢¹ÖµÄÉ˺¦  
 | 
        if defObj.GetIsBoss() > ChConfig.Def_NPCType_Ogre_Super:  
 | 
            return  
 | 
          
 | 
        if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull and \  
 | 
        GameWorld.GetMap().GetMapID() not in IpyGameDataPY.GetFuncEvalCfg('SkillXPAddByFB', 1):  
 | 
            return  
 | 
    elif effectID == ChConfig.Def_Skill_Effect_AttackReplaceByNPCSeries:  
 | 
        # ¶ÔÖ¸¶¨ÏµÔì³ÉÖ¸¶¨É˺¦  
 | 
        if findEffect.GetEffectValue(2)&NPCCommon.GetNPCSeries(defObj) == 0:  
 | 
            return  
 | 
    return findEffect   
 | 
      
 | 
      
 | 
# ´ÓЧ¹ûIDÁбíÖÐÕÒµ½ÆäÖÐÒ»¸öЧ¹û  
 | 
def GetSkillEffectByEffectIDs(curSkill, effectIDList):  
 | 
    for i in range(0, curSkill.GetEffectCount()):  
 | 
        curEffect = curSkill.GetEffect(i)  
 | 
        curEffectID = curEffect.GetEffectID()  
 | 
          
 | 
        if not curEffectID:  
 | 
            #²ß»®ÓпÉÄÜÖÐ;ɾ³ý£¬²»ÓÃreturn  
 | 
            continue  
 | 
          
 | 
        #²»ÊÇÐèÒªµÄЧ¹û  
 | 
        if curEffectID not in effectIDList:  
 | 
            continue  
 | 
          
 | 
        #ÕÒµ½ÁË  
 | 
        return curEffect, curEffectID  
 | 
      
 | 
    return None, 0  
 | 
  
 | 
      
 | 
      
 | 
# ElfÁéÎªÌæÉí¹¥»÷£¬ÒªÈ¡Íæ¼ÒµÄÊôÐÔ£¬NPCΪÖ÷ÈËÔò»¹ÊÇÈ¡Áé  
 | 
def ElfChangeAttacker(attacker):  
 | 
    if attacker.GetGameObjType() != IPY_GameWorld.gotNPC:  
 | 
        # --Íæ¼Ò  
 | 
        return attacker  
 | 
      
 | 
    npcType = attacker.GetType()  
 | 
    if npcType == IPY_GameWorld.ntElf:  
 | 
        # ntElf ¶¨ÒåΪÈËÎïʹÓöԵسÖÐøÐÔ¼¼ÄÜ£¬²¢ÇÒÈËÎï¿ÉÒÔÒÆ¶¯£¬ÔòÐèÒªntElf×öÒÀÍÐÎïµÄÇé¿ö  
 | 
        # ÄÇôntElfÖ´ÐÐÈËÎïµÄÉ˺¦¼ÆËãºÍ±»¶¯´¥·¢Ð§¹û  
 | 
        # 2018-11-16 Elf Ö§³ÖÖ÷ÈËΪNPC  
 | 
        # owner = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, attacker)  
 | 
          
 | 
        owner = NPCCommon.GetSummonOwnerDetel(attacker)  
 | 
        return attacker if not owner else owner  
 | 
      
 | 
    return attacker  
 | 
     
 | 
# ¼ì²é¶ÔÏóÊÇ·ñÊôÓÚÍæ¼Ò£¬±ÈÈçÓÃÓÚ´¿PVPÑéÖ¤  
 | 
def CheckIsPlayerOnwer(gameObj):  
 | 
    if not gameObj:  
 | 
        return False  
 | 
      
 | 
    objType = gameObj.GetGameObjType()  
 | 
      
 | 
    if objType == IPY_GameWorld.gotPlayer:  
 | 
        return True  
 | 
      
 | 
    objNPCType = gameObj.GetGameNPCObjType()  
 | 
    if objNPCType == IPY_GameWorld.gnotNormal:  
 | 
        return False  
 | 
      
 | 
    if objNPCType == IPY_GameWorld.gnotSummon:  
 | 
        owner = NPCCommon.GetSummonOwnerDetel(gameObj)  
 | 
        if not owner:  
 | 
            return False  
 | 
        if owner.GetGameObjType() != IPY_GameWorld.gotPlayer:  
 | 
            return False  
 | 
              
 | 
    return True  
 | 
      
 | 
# ¹¥»÷ʱ·ÀÊØ·½Éñ±ø»¤¶ÜµÄ´¦Àí  
 | 
def CalcAtkProDef(atkObj, defObj, hurtValue, curSkill, tick):  
 | 
    if defObj.GetGameObjType() != IPY_GameWorld.gotPlayer:  
 | 
        return hurtValue  
 | 
      
 | 
    if not CheckIsPlayerOnwer(atkObj):  
 | 
        return hurtValue  
 | 
  
 | 
    curProDef = PlayerControl.GetProDef(defObj)  
 | 
    if not curProDef:  
 | 
        return hurtValue  
 | 
      
 | 
    absortValue = min(PlayerControl.GetProDefAbsorb(defObj)*hurtValue/ChConfig.Def_MaxRateValue, curProDef)  
 | 
      
 | 
    PlayerControl.SetProDef(defObj, curProDef - absortValue)  
 | 
      
 | 
    # ±»¶¯¼¼ÄÜ´¥·¢  
 | 
    defObj.SetDict(ChConfig.Def_PlayerKey_GodWeaponBeforeProDef, curProDef)  
 | 
    PassiveBuffEffMng.OnPassiveSkillTrigger(defObj, atkObj, None, ChConfig.TriggerType_ProDefValue, tick)  
 | 
    return hurtValue - absortValue  
 | 
  
 | 
## ¼ÆËãÉËѪֵ  
 | 
#  @param atkObj ¹¥»÷Õß  
 | 
#  @param defObj ·ÀÓùÕß  
 | 
#  @param atkType ¹¥»÷ÀàÐÍ(ÆÕͨ¹¥»÷ ½£Æø¹¥»÷)  
 | 
#  @param atkSkillValue ¹¥»÷Õß¼¼ÄÜÔöÇ¿  
 | 
#  @param atkSkillPer ¹¥»÷Õß¼¼ÄÜÔöÇ¿°Ù·Ö±È  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @param happenState ¼¼ÄÜ·¢Éú״̬  
 | 
#  @param finalHurtPer ¶Ô×îÖÕ¼ÆËã³öÀ´µÄÉ˺¦Ó°ÏìЧ¹û(ÓÐÕý¸º£¬Ä¬ÈÏ10000)  
 | 
#  @return None or HurtType É˺¦½á¹¹ÌåÀà   
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def GetHurtHP(attacker, defObj, curSkill, atkSkillValue, atkSkillPer, tick):  
 | 
    atkObj = ElfChangeAttacker(attacker)  # ElfÁéÎªÌæÉí¹¥»÷£¬ÒªÈ¡Íæ¼ÒµÄÊôÐÔ  
 | 
      
 | 
    resultHurtType = HurtType()  
 | 
    defObjType = defObj.GetGameObjType()  
 | 
    dHP = GameObj.GetHP(defObj)                # ·ÀÊØ·½µ±Ç°ÑªÁ¿  
 | 
    dMaxHP = GameObj.GetMaxHP(defObj)          # ·ÀÊØ·½×î´óѪÁ¿  
 | 
      
 | 
    # µ±¼¼ÄܱíµÄ¼¼ÄÜÉ˺¦°Ù·Ö±ÈΪ0£¬¼¼ÄÜÉ˺¦Ôö¼ÓÖµ¶¨ÒåΪֱ½ÓÉ˺¦Öµ£¬²»¾¹ý¼ÆËã  
 | 
    if atkSkillPer == 0:  
 | 
        hurtValue, hurtType = int(atkSkillValue), ChConfig.Def_HurtType_Normal  
 | 
        hurtValue += atkObj.GetDictByKey(ChConfig.Def_PlayerKey_MoreHurtValue)  
 | 
          
 | 
    elif SkillShell.IsPlayerUseSkill(atkObj, curSkill) and SkillShell.isClientHurtValue(defObj.GetID(), defObjType):  
 | 
        # »º´æµ¥´Î¹¥»÷ÖеÄ×î´óÉ˺¦,±»¶¯¼¼ÄܸÅÂÊÐÔÔö¼ÓÉ˺¦£¬´Ë´¦·Å´ó×î´óÉ˺¦  
 | 
        hurtValue = atkObj.GetDictByKey(ChConfig.Def_PlayerKey_ClientMaxHurtValue)  
 | 
        if hurtValue == 0:  
 | 
            #hurtValue, hurtType = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, None, True)  
 | 
            # ÀíÂÛÉ˺¦Ò»Ö£¬ ¶à¼ÓµãÔ¤ËãÉ˺¦±ÜÃâ¼ÆËãÎó²î  
 | 
            #hurtValue = min(ShareDefine.Def_UpperLimit_DWord, hurtValue+10)  
 | 
            #atkObj.SetDict(ChConfig.Def_PlayerKey_ClientMaxHurtValue, int(hurtValue*1.2))  
 | 
            hurtValue = atkObj.GetMaxAtk()*atkSkillPer*20   # ¼ÓÈë±»¶¯¼ÆË㲻׼ȷ¸Ä³É¹ÀËã  
 | 
              
 | 
        clientValue, hurtType = SkillShell.GetClientHurtByObj(defObj.GetID(), defObjType)  
 | 
        if clientValue <= hurtValue:  
 | 
            hurtValue = clientValue  
 | 
        else:  
 | 
            # Íâ¹Ò×î¸ßÉ˺¦»ù±¾·À·¶  
 | 
            GameWorld.DebugAnswer(atkObj, "%s----¿Í»§¶ËÉ˺¦ %s ·þÎñ¶Ë×î¸ßÉ˺¦ %s"%(atkObj.GetID(), [clientValue, hurtType], hurtValue))  
 | 
            hurtValue = int(hurtValue*0.8)  
 | 
        #GameWorld.DebugAnswer(atkObj, "¿Í»§¶ËÉ˺¦ %s ·þÎñ¶ËÉ˺¦ %s"%([defObj.GetID(), clientValue, hurtType], hurtValue))  
 | 
  
 | 
    else:  
 | 
        hurtValue, hurtType = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, orgAtkObj=attacker)  
 | 
      
 | 
    # ÓÅÏÈ´¦ÀíÉñ±ø»¤¶Ü  
 | 
    hurtValue = CalcAtkProDef(atkObj, defObj, hurtValue, curSkill, tick)  
 | 
  
 | 
    # É˺¦ÎüÊÕ¶Ü»ØÑªÐÍ  
 | 
    buffManager = defObj.GetBuffState()  
 | 
    curEffect, plusValue, skillID = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_AbsorbShieldXMZJ)  
 | 
    if skillID:  
 | 
        absortValue = hurtValue*curEffect.GetEffectValue(0)/ShareDefine.Def_MaxRateValue  
 | 
        if absortValue:  
 | 
            hurtValue -= absortValue  
 | 
            findBuff = SkillCommon.FindBuffByID(defObj, skillID)[0]  
 | 
            if findBuff:  
 | 
                # ÓÃÓÚ»ØÑª  
 | 
                findBuff.SetValue(int(findBuff.GetValue() + absortValue))  
 | 
  
 | 
    if defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldValue):  
 | 
        # ÷è÷뻤¶ÜÎüÊÕÉ˺¦£¬½«µÖÏûµÄÉ˺¦´æ´¢  
 | 
        absortValue = int(defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldValue)/float(ShareDefine.Def_MaxRateValue)*hurtValue)     
 | 
        hurtValue -= absortValue  
 | 
          
 | 
        # ÎüÊÕÖÁÖ¸¶¨ÑªÁ¿±ÈÀýÖµ  
 | 
        absorbHurt = defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShield)  
 | 
        if absorbHurt <= defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldMax):  
 | 
            maxValue = min(absorbHurt + absortValue, defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldMax))  
 | 
            defObj.SetDict(ChConfig.Def_PlayerKey_AbsorbShield, maxValue)    # ¼Ç¼»¤¶ÜÎüÊÕµÄÉ˺¦ÓÃÓÚ±¬Õ¨  
 | 
  
 | 
    # buff¼õÉÙÉ˺¦°Ù·Ö±È  
 | 
    reducePer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ReduceHurtHPPer)  
 | 
      
 | 
    # ±»¹¥»÷±»¶¯¼¼ÄÜÌØÊâ¼õÃâ Êܵ½µ¥´ÎÉ˺¦³¬¹ýÉúÃüÉÏÏÞ10%ʱºò£¬¼õÃâ50%É˺¦£¬CD10Ãë  
 | 
    defObj.SetDict(ChConfig.Def_PlayerKey_curHurtValue, hurtValue)  
 | 
    reducePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ReduceHurtHPPer)  
 | 
    hurtValue = int(hurtValue*(max(ChConfig.Def_MaxRateValue - reducePer, 0))*1.0/ChConfig.Def_MaxRateValue)  
 | 
      
 | 
  
 | 
    # Õ¶É±£¬±ôËÀµÈÇé¿öµÄ´¦Àí  
 | 
    if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackKill):  
 | 
        # Õ¶É±  
 | 
        hurtValue = GameObj.GetHP(defObj)  
 | 
        #É˺¦½á¹¹Ìå  
 | 
        resultHurtType.HurtHP = hurtValue  
 | 
        resultHurtType.HurtType = hurtType  
 | 
        resultHurtType.RealHurtHP = hurtValue  
 | 
          
 | 
        remainHP = 0 # Ê£ÓàѪÁ¿  
 | 
  
 | 
    else:  
 | 
        #É˺¦½á¹¹Ìå  
 | 
        resultHurtType.HurtHP = hurtValue  
 | 
        resultHurtType.HurtType = hurtType  
 | 
        resultHurtType.RealHurtHP = hurtValue  
 | 
          
 | 
        # Ñª¶Ü   
 | 
        hurtValue = CalcBloodShield(atkObj, defObj, hurtValue)  
 | 
        remainHP = min(dMaxHP, max(0, dHP - hurtValue)) # Ê£ÓàѪÁ¿  
 | 
      
 | 
    remainHP = int(remainHP)    #·À·¶  
 | 
    if defObjType == IPY_GameWorld.gotPlayer:  
 | 
        curHP = GameObj.GetHP(defObj)  
 | 
        GameObj.SetHP(defObj, remainHP, False)  
 | 
          
 | 
        lockHPPer = PassiveBuffEffMng.OnObjsPassiveSkillLockHP(defObj, atkObj, curSkill, ChConfig.TriggerType_LockHP, tick)  
 | 
        if lockHPPer:  
 | 
            # ËøÑªÇé¿ö  
 | 
            lockHP = GameObj.GetMaxHP(defObj)*lockHPPer/ChConfig.Def_MaxRateValue  
 | 
            if lockHP < curHP and remainHP < lockHP:  
 | 
                remainHP = lockHP  
 | 
            elif lockHP >= curHP:  
 | 
                remainHP = curHP  
 | 
              
 | 
            #ËøÑª¾ÀÕýѪÁ¿  
 | 
            GameObj.SetHP(defObj, remainHP, False)  
 | 
              
 | 
    elif defObjType == IPY_GameWorld.gotNPC:  
 | 
        if defObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:  
 | 
            #ÉèÖóèÎïÊ£ÓàѪÁ¿  
 | 
            PetControl.SetPetHP(defObj, remainHP)  
 | 
              
 | 
        elif defObj.GetGameNPCObjType() == IPY_GameWorld.gnotTruck:  
 | 
            remainHP = max(PlayerTruck.GetTruckDestroyMinHP(defObj), remainHP)  
 | 
            GameObj.SetHP(defObj, remainHP)  
 | 
          
 | 
        elif defObj.GetType() == ChConfig.ntHelpBattleRobot:  
 | 
            remainHP = min(dHP, max(GameObj.GetMaxHP(defObj)/2, remainHP)) # ÖúÕ½»úÆ÷ÈËÊ£ÓàѪÁ¿²»ÄÜÉÙÓÚÒ»°ë  
 | 
            GameObj.SetHP(defObj, remainHP)  
 | 
              
 | 
        else:  
 | 
            #·ÀÊØ·½ÊǹÖÎïNPC£¬Ö»¿ÛÆäѪ  
 | 
            GameObj.SetHP(defObj, remainHP)  
 | 
    else:  
 | 
        GameWorld.ErrLog('¼ÆËãÉËѪֵʱ,·ÀÊØ·½ÀàÐÍ´íÎó£ºdefObjType = %s' % (defObjType))  
 | 
        return resultHurtType  
 | 
  
 | 
    if GameObj.GetHP(defObj) > 0:  
 | 
        # ±»¹¥»÷Õß½«²¿·ÖÉ˺¦×ª»¯ÎªÑªÁ¿, ·µ»Ø×ª»¯µÄ°Ù·Ö±È(СÊýµã)  
 | 
        changePer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ChangeHurtToHP)  
 | 
        if changePer:  
 | 
            SkillCommon.SkillAddHP(defObj, 0, int(changePer*hurtValue))  
 | 
      
 | 
    lostValue = dHP - GameObj.GetHP(defObj) # Êµ¼ÊµôѪÁ¿  
 | 
    resultHurtType.LostHP = lostValue  
 | 
    if defObjType == IPY_GameWorld.gotPlayer:  
 | 
        FBLogic.OnFBLostHP(defObj, lostValue)  
 | 
          
 | 
    #¹¥»÷´¥·¢Ê¼þ, ¸Ã´úÂëÓ¦¸Ã·ÅÔÚDoAttackº¯ÊýÖд¦ÀíÂß¼±È½ÏÇåÎú£¬Ò²²»»áÆÆ»µGetHurtHPº¯Êý  
 | 
    #ÒòΪDoAttackÐ޸ĵã±È½Ï¶à£¬Ôݲ»Ç¨ÒÆ£¬Ïà¹Ø¹¥»÷ʼþÂß¼£¬¾ÍÍù´Ëº¯ÊýÖÐÌí¼Ó  
 | 
    AttackEventTrigger(atkObj, defObj, curSkill, resultHurtType, tick)  
 | 
    #===========================================================================  
 | 
    # if atkObj.GetGameObjType() == IPY_GameWorld.gotPlayer:  
 | 
    #    GameWorld.DebugAnswer(atkObj, "--%sÊ£ÓàѪÁ¿ %s"%(defObj.GetID(), defObj.GetHP()))  
 | 
    #===========================================================================  
 | 
      
 | 
    return resultHurtType  
 | 
  
 | 
  
 | 
# Ñª¶ÜÖ§³Ö¶à¸öͬʱ´æÔÚ  
 | 
def CalcBloodShield(atkObj, defObj, hurtValue):  
 | 
    # É˺¦ÖµÓÃÓÚѪ¶ÜµÖÏû  
 | 
    defObj.SetDict(ChConfig.Def_PlayerKey_BloodShiledHurt, hurtValue)  
 | 
      
 | 
    PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, None, ChConfig.TriggerType_BloodShield)  
 | 
      
 | 
    return defObj.GetDictByKey(ChConfig.Def_PlayerKey_BloodShiledHurt)  
 | 
  
 | 
  
 | 
# ¼ÆËã¹¥»÷É˺¦  
 | 
# maxHurt²ÎÊýÓÃÓÚÄ£Äâ¼ÆËã×î´óÉ˺¦£¬·À·¶¿Í»§¶Ë¹¥»÷É˺¦¹ý¸ß  
 | 
def CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, happenState=None, **atkwargs):  
 | 
    # ·¹öÉÁ±ÜÌØÊâ´¦Àí  
 | 
    if tick - defObj.GetDictByKey(ChConfig.Def_PlayerKey_SomersaultTime) < 500:  
 | 
        return 0, ChConfig.Def_HurtType_Miss  
 | 
      
 | 
    summonAtkPer = 1    # ÕÙ»½¼Ì³ÐÌá¸ß»ù´¡¹¥»÷Á¦£¬È¡±í  
 | 
    summonAtkObj = atkwargs.get('orgAtkObj', None) if atkwargs.get('orgAtkObj', None) else atkObj  
 | 
    if summonAtkObj.GetGameObjType() == IPY_GameWorld.gotNPC and summonAtkObj.GetGameNPCObjType() == IPY_GameWorld.gnotSummon:  
 | 
        summonAtkPerValue = summonAtkObj.GetDictByKey(ChConfig.Def_GameObjKey_InheritOwner)  
 | 
        if summonAtkPerValue > 0:  
 | 
            # ±©·çÑ©ÀàÕÙ»½ÊÞת»¯ÎªÖ÷È˼ÆËãÉ˺¦  
 | 
            ownerAtkObj = NPCCommon.GetSummonOwnerDetel(summonAtkObj)  
 | 
            if not ownerAtkObj:  
 | 
                return 0, ChConfig.Def_HurtType_Miss  
 | 
              
 | 
            summonAtkPer = summonAtkPerValue*1.0/ChConfig.Def_MaxRateValue  
 | 
            #GameWorld.DebugLog("ÕÙ»½ÊÞÈ¡Ö÷ÈË---------%s-%s-%s-%s"%(ownerAtkObj.GetID(), atkSkillPer, atkSkillValue, summonAtkPer))  
 | 
          
 | 
    atkObjType = atkObj.GetGameObjType()  
 | 
    defObjType = defObj.GetGameObjType()  
 | 
  
 | 
  
 | 
    atkType = GetBattleType(atkObj, curSkill)  
 | 
    happenState = happenState if happenState else SkillShell.GetHappenState(curSkill)  
 | 
    happenState += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HappenState)  
 | 
  
 | 
    aLV = atkObj.GetLV()                # ¹¥»÷·½µÈ¼¶  
 | 
    dLV = defObj.GetLV()                # ·ÀÊØ·½µÈ¼¶  
 | 
  
 | 
    aHit = atkObj.GetHit()  
 | 
    aHitSuccessRate = PlayerControl.GetHitSucessRate(atkObj) if atkObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue  
 | 
    dMiss = defObj.GetMiss()  
 | 
    dMiss += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissPer)  
 | 
    dMissSuccessRate = PlayerControl.GetMissSucessRate(defObj) if defObjType == IPY_GameWorld.gotPlayer else 0  
 | 
    dMissSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissSuccessPer)  
 | 
    skillID = curSkill.GetSkillID() if curSkill else 0  
 | 
      
 | 
      
 | 
    atkIsBoss = 0 # ¹¥»÷·½ÊÇ·ñboss  
 | 
    suppressValueLV = 0 # µÈ¼¶×îÖÕÑ¹ÖÆÖµ, ÓÉÑ¹ÖÆ¹æÔò¼°Ïà¹Ø²ÎÊý¼ÆËãµÃ³ö£¬¿É×÷ΪÉ˺¦¹«Ê½¼ÆËã²ÎÊýʹÓà  
 | 
    suppressValueFP = 0 # Õ½Á¦×îÖÕÑ¹ÖÆÖµ, ÓÉÑ¹ÖÆ¹æÔò¼°Ïà¹Ø²ÎÊý¼ÆËãµÃ³ö£¬¿É×÷ΪÉ˺¦¹«Ê½¼ÆËã²ÎÊýʹÓà  
 | 
    suppressLV, suppressFightPower = 0, 0 # Ñ¹ÖƵȼ¶²î¡¢Õ½Á¦²î  
 | 
    suppressReMaxHP = 0 # NPCÑ¹ÖÆµÈ¼¶ÉúÃüÖµ, µÈ¼¶±íÖÐNPCµÈ¼¶¶ÔÓ¦µÄÊý¾Ý, Ñ¹ÖƵȼ¶²î´óÓÚ0ʱ²ÅÓÐÖµ  
 | 
    suppressNPCFightPower = 0 # Ñ¹ÖÆNPCÕ½Á¦  
 | 
    fbFightPower, fbBaseHurt = 0, 0 # ¸±±¾Õ½Á¦, ¸±±¾±£µ×É˺¦  
 | 
    #µ±¹¥»÷·½ÎªNPC£¬·ÀÊØ·½ÎªÍæ¼Òʱ£¬¼ÆËãÑ¹ÖÆµÈ¼¶ ¼° Ñ¹ÖÆÕ½Á¦  
 | 
    if atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotPlayer:  
 | 
          
 | 
        if curSkill and curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_RealmSuppress:  
 | 
            # ¾³½çÑ¹ÖÆ¼¼Äܲ»¶Ô¸ßµÈ¼¶¾³½çÍæ¼Ò²úÉú¹¥»÷  
 | 
            aRealmLV, dRealmLV = GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType)   
 | 
            if aRealmLV <= dRealmLV:  
 | 
                return 0, ChConfig.Def_HurtType_Immune   # ÃâÒß  
 | 
          
 | 
        atkIsBoss = 1 if ChConfig.IsGameBoss(atkObj) else 0  
 | 
        if NPCCommon.GetIsLVSuppress(atkObj):  
 | 
            suppressLV = max(0, aLV - dLV)  
 | 
            if suppressLV:  
 | 
                suppressLVIpyData = PlayerControl.GetPlayerLVIpyData(aLV)  
 | 
                suppressReMaxHP = 0 if not suppressLVIpyData else suppressLVIpyData.GetReMaxHP()  
 | 
        suppressNPCFightPower = NPCCommon.GetSuppressFightPower(atkObj)  
 | 
        if suppressNPCFightPower:  
 | 
            suppressFightPower = max(0, suppressNPCFightPower - defObj.GetFightPower())  
 | 
              
 | 
    mustHit = False  
 | 
    helpBattleFormatKey = ""  
 | 
    if atkObjType == IPY_GameWorld.gotNPC and atkObj.GetType() == ChConfig.ntHelpBattleRobot:  
 | 
        mustHit = True  
 | 
        suppressNPCFightPower = NPCCommon.GetSuppressFightPower(atkObj)  
 | 
        fbFightPower = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.FBPD_HelpBattleFBFightPower)  
 | 
        fbBaseHurt = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.FBPD_HelpBattleFBBaseHurt)  
 | 
        helpBattleFormatKey = "HelpRobot_Atk"  
 | 
    if defObjType == IPY_GameWorld.gotNPC and defObj.GetType() == ChConfig.ntHelpBattleRobot:  
 | 
        mustHit = True  
 | 
        suppressNPCFightPower = NPCCommon.GetSuppressFightPower(defObj)  
 | 
        fbFightPower = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.FBPD_HelpBattleFBFightPower)  
 | 
        fbBaseHurt = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.FBPD_HelpBattleFBBaseHurt)  
 | 
        helpBattleFormatKey = "HelpRobot_Def"  
 | 
          
 | 
    #ÃüÖй«Ê½ ¹¥»÷·½ÀàÐͲ»Í¬£¬¹«Ê½²»Í¬  
 | 
    hitFormula = ReadChConfig.GetChConfig('CalcCanHit')  
 | 
      
 | 
    if not mustHit and not PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill,   
 | 
                           ChConfig.TriggerType_Buff_MustBeHit):  
 | 
        # ¼¼ÄܶÔÖ¸¶¨BOSSÎÞЧ¹ûµÄ·µ»ØMISS  
 | 
        if defObjType == IPY_GameWorld.gotNPC and defObj.GetIsBoss() not in ChConfig.Def_SkillAttack_NPCIsBoss \  
 | 
        and SkillCommon.GetSkillBattleType(curSkill) == ChConfig.Def_BattleRelationType_CommNoBoss:  
 | 
            return 0, ChConfig.Def_HurtType_Miss  
 | 
          
 | 
        #¹¥»÷·½´¦ÓÚ³°·í£¬·ÀÊØ·½´¦ÓÚÃâÒß³°·íÕß¹¥»÷Ôòmiss  
 | 
        if GameObj.GetPyPlayerState(atkObj, ChConfig.Def_PlayerState_Sneer) and \  
 | 
        GameObj.GetPyPlayerState(defObj, ChConfig.Def_PlayerState_MissSneerAtk):  
 | 
            return 0, ChConfig.Def_HurtType_Miss  
 | 
          
 | 
        #Ìí¼ÓÊÇ·ñ±ØÃüÖÐ  
 | 
        if not IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_HitOn) \  
 | 
            and eval(hitFormula) < 0:  
 | 
            return 0, ChConfig.Def_HurtType_Miss  
 | 
      
 | 
  
 | 
    hurtType, hurtTypeResultDict = CalcHurtTypeResult(atkObj, defObj, atkObjType, defObjType, happenState)  
 | 
    #GameWorld.DebugLog("GetHurtHP hurtType=%s, hurtTypeResultDict=%s" % (hurtType, hurtTypeResultDict))  
 | 
    isLuckyHit, aLuckyHit, dLuckyHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_LuckyHit] # ÐÒÔËÒ»»÷  
 | 
    isSuperHit, aSuperHit, dSuperHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_SuperHit] # ±©»÷  
 | 
    dDamChanceDef = hurtTypeResultDict[ChConfig.Def_HurtType_Parry][2] # µÖÓù, ´óÓÚ0´ú±í´¥·¢µÖÓùЧ¹û  
 | 
  
 | 
    if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_OneDamage):  
 | 
        return 1, hurtType  
 | 
      
 | 
    worldLV = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)  
 | 
    wLVIpyData = PlayerControl.GetPlayerLVIpyData(worldLV)  
 | 
    wReFightPower = 0 if not wLVIpyData else wLVIpyData.GetReFightPower() # µ±Ç°ÊÀ½çµÈ¼¶²Î¿¼Õ½Á¦  
 | 
      
 | 
    # ¸Ä±ä¼¼ÄÜÉ˺¦  
 | 
    atkSkillPer, atkSkillValue = ChangeSkillHurt(atkObj, defObj, curSkill, atkSkillPer, atkSkillValue)  
 | 
      
 | 
    #  atkSkillPer °üº¬ÆÕ¹¥£¬ËùÒÔ²»ÊÇÓü¼ÄÜÔöÇ¿´¦Àí  
 | 
    atkSkillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddSkillPer)  
 | 
      
 | 
    atkSkillPer += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddSkillPer)  
 | 
      
 | 
      
 | 
    aIceAtkSuperHit = 1 # ÔªËØÕæÉ˱¶Öµ£¬ÔÝʱĬÈÏΪ1£¬Ö®ºóÀ©Õ¹  
 | 
    aIceAtkSuperHit += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddIceAtkPer)  
 | 
    aIceAtkSuperHit += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddIceAtkPer)  
 | 
      
 | 
      
 | 
    if isSuperHit:  
 | 
        addASuperHit = PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitValue)  
 | 
        aSuperHit = aSuperHit*(ChConfig.Def_MaxRateValue + addASuperHit)*1.0/ChConfig.Def_MaxRateValue  
 | 
  
 | 
        # ±©»÷Ôö¼Ó¼¼ÄÜÉ˺¦  
 | 
        atkSkillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitSkillPer)  
 | 
  
 | 
    if isLuckyHit:  
 | 
        # »áÐÄÒ»»÷ʱÔö¼Ó»áÐÄÉ˺¦°Ù·Ö±È   
 | 
        aLuckyHit += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_LuckyHit)  
 | 
        aLuckyHit -= PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, curSkill, ChConfig.TriggerType_BeLuckyHitSubPer)  
 | 
        aLuckyHit = max(aLuckyHit, 0)  
 | 
          
 | 
    #²ÎÓëÔËËãµÄÊýÖµ  
 | 
    rand = random.random()                #ÖÖ×ÓÊý 0~1  
 | 
      
 | 
    #------- ¹¥»÷·½  
 | 
    aMinAtk = atkObj.GetMinAtk() * summonAtkPer        # ¹¥»÷·½×îС¹¥»÷  
 | 
    aMaxAtk = atkObj.GetMaxAtk() * summonAtkPer       # ¹¥»÷·½×î´ó¹¥»÷  
 | 
      
 | 
    aIceAtk = atkObj.GetIceAtk()        # ±ù¹¥, ÔªËØÕæÉË, Íæ¼Ò¼°NPCͨÓà  
 | 
    aIceAtk += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddIceAtk)  
 | 
    #------- ·ÀÊØ·½  
 | 
    dMinAtk = defObj.GetMinAtk()        # ·ÀÊØ·½×îС¹¥»÷  
 | 
    dMaxAtk = defObj.GetMaxAtk()        # ·ÀÊØ·½×î´ó¹¥»÷  
 | 
    dDef = defObj.GetDef()              # ·ÀÊØ·½·ÀÓùÁ¦  
 | 
    dHP = GameObj.GetHP(defObj)                # ·ÀÊØ·½µ±Ç°ÑªÁ¿  
 | 
    dMaxHP = GameObj.GetMaxHP(defObj)          # ·ÀÊØ·½×î´óѪÁ¿  
 | 
    dIceDef = defObj.GetIceDef()        # ±ù·À, ÔªËØÕæ·À, Íæ¼Ò¼°NPCͨÓà  
 | 
      
 | 
    # ¹¥»÷·½  
 | 
    if atkObjType == IPY_GameWorld.gotPlayer:  
 | 
        aIgnoreDefRate = atkObj.GetIgnoreDefRate()  # ÎÞÊÓ·ÀÓù±ÈÂÊ  
 | 
        aSkillAtkRate = atkObj.GetSkillAtkRate()    # ¼¼Äܹ¥»÷Á¦¼Ó³É  
 | 
        aDamagePer = PlayerControl.GetDamagePer(atkObj)     # Íâ²ãÉ˺¦¼Ó³É  
 | 
        # ±»¶¯¼¼ÄÜÔö¼ÓÉ˺¦  
 | 
        aDamagePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddDamagePer)  
 | 
        aDamagePer += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddDamagePer)  
 | 
          
 | 
        aNPCHurtAddPer = PlayerControl.GetNPCHurtAddPer(atkObj)     # PVEÉ˺¦¼Ó³É  
 | 
        aDamagePerPVP = PlayerControl.GetDamagePerPVP(atkObj)     # Íâ²ãPVPÉ˺¦¼Ó³É  
 | 
        aFinalHurtPer = PlayerControl.GetFinalHurtPer(atkObj) # ×îÍâ²ãÉ˺¦¼Ó³É, ¿ÉÄÜΪ¸ºÖµ  
 | 
        aFinalHurtPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddFinalPer)  
 | 
          
 | 
        aFinalHurt = PlayerControl.GetFinalHurt(atkObj)     # ×îÖչ̶¨É˺¦  
 | 
        # ±»¶¯Ôö¼Ó×îÖÕÉ˺¦  
 | 
        aFinalHurt += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddFinalValue)  
 | 
        aFinalHurt += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddFinalValue)  
 | 
          
 | 
        aOnlyFinalHurt = PlayerControl.GetOnlyFinalHurt(atkObj) # ¶îÍâ¹Ì¶¨É˺¦  
 | 
        aFightPower = atkObj.GetFightPower()  
 | 
          
 | 
    else:  
 | 
        aIgnoreDefRate = 0  # ÎÞÊÓ·ÀÓù±ÈÂÊ  
 | 
        aFinalHurtPer = GameObj.GetPetDamPer(atkObj) # ×îÍâ²ãÉ˺¦¼Ó³É, ¿ÉÄÜΪ¸ºÖµ  
 | 
        aSkillAtkRate = NPCCommon.GetSkillAtkRate(atkObj)   # ¼¼Äܹ¥»÷Á¦¼Ó³É  
 | 
        if atkObjType == IPY_GameWorld.gotNPC and atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:  
 | 
            aSkillAtkRate += atkObj.GetSkillAtkRate()  
 | 
              
 | 
        aNPCHurtAddPer = 0  # PVEÉ˺¦¼Ó³É  
 | 
        aDamagePer = 0      # Íâ²ãÉ˺¦¼Ó³É  
 | 
        aDamagePerPVP = 0   # Íâ²ãPVPÉ˺¦¼Ó³É  
 | 
        aFinalHurt = NPCCommon.GetFinalHurt(atkObj) # ×îÖչ̶¨É˺¦  
 | 
        aFightPower = NPCCommon.GetSuppressFightPower(atkObj)  
 | 
          
 | 
    #·ÀÊØ·½µÄÀàÐÍ  
 | 
    if defObjType == IPY_GameWorld.gotPlayer:  
 | 
        dIgnoreDefRateReduce = PlayerControl.GetIgnoreDefRateReduce(defObj)  # ÎÞÊÓ·ÀÓù±ÈÂÊ¿¹ÐÔ  
 | 
        dSkillAtkRateReduce = PlayerControl.GetSkillAtkRateReduce(defObj) # ¼¼Äܹ¥»÷Á¦¼õÉÙ  
 | 
        dDamReduce = defObj.GetDamageReduceRate() # Íâ²ã¼õÉË  
 | 
        dDamReduce += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_DamageReduce)  
 | 
        dDamagePerPVPReduce = PlayerControl.GetDamagePerPVPReduce(defObj) # Íâ²ãPVP¼õÉË  
 | 
        dDamagePerPVPReduce += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_DamageReducePVP)  
 | 
        dFinalHurtReduce = PlayerControl.GetFinalHurtReduce(defObj) # ×îÖչ̶¨É˺¦¼õÉÙ  
 | 
        dBeHurtPer = PlayerControl.GetBeHurtPer(defObj)      # ¼ÓÉîÊܵ½É˺¦°Ù·Ö±È  
 | 
        dFightPower = defObj.GetFightPower()  
 | 
    else:  
 | 
        dIgnoreDefRateReduce = 0    # ÎÞÊÓ·ÀÓù±ÈÂÊ¿¹ÐÔ  
 | 
        dSkillAtkRateReduce = 0     # ¼¼Äܹ¥»÷Á¦¼õÉÙ  
 | 
        dDamReduce = 0              # Íâ²ã¼õÉË   
 | 
        dDamagePerPVPReduce = 0     # Íâ²ãPVP¼õÉË  
 | 
        dFinalHurtReduce = 0        # ×îÖչ̶¨É˺¦¼õÉÙ  
 | 
        dBeHurtPer = 0  
 | 
        dFightPower = NPCCommon.GetSuppressFightPower(defObj)  
 | 
          
 | 
    #¹¥»÷×Öµä { ¹¥»÷ÀàÐÍ : '¹«Ê½' }  
 | 
    hurtDist = ReadChConfig.GetEvalChConfig('CalcAttackValue')  
 | 
      
 | 
    if suppressLV:  
 | 
        suppressFormulaKeyLV = "SuppressValueLV_%s" % (atkIsBoss)  
 | 
        if suppressFormulaKeyLV in hurtDist:  
 | 
            suppressLVFormula = hurtDist[suppressFormulaKeyLV]  
 | 
            suppressValueLV = eval(FormulaControl.GetCompileFormula(suppressFormulaKeyLV, suppressLVFormula))  
 | 
              
 | 
    if suppressFightPower:  
 | 
        suppressFormulaKeyFP = "SuppressValueFP_%s" % (atkIsBoss)  
 | 
        if suppressFormulaKeyFP in hurtDist:  
 | 
            suppressFPFormula = hurtDist[suppressFormulaKeyFP]  
 | 
            suppressValueFP = eval(FormulaControl.GetCompileFormula(suppressFormulaKeyFP, suppressFPFormula))  
 | 
      
 | 
    # ¾³½çÑ¹ÖÆ°Ù·Ö±È  
 | 
    SuppressValueRealmRate = 10000 # Ä¬ÈÏÖµ  
 | 
    suppressRealm = 0  
 | 
    if atkObjType == IPY_GameWorld.gotPlayer and defObjType == IPY_GameWorld.gotPlayer:  
 | 
        RealmGroupList = IpyGameDataPY.GetFuncEvalCfg("RealmGroup", 1)  
 | 
        aRealmLV, dRealmLV = atkObj.GetOfficialRank(), defObj.GetOfficialRank()  
 | 
        aRealmGroup, dRealmGroup = 0, 0  
 | 
        for g, gMaxRealmLV in enumerate(RealmGroupList, 1):  
 | 
            if aRealmLV and aRealmLV <= gMaxRealmLV and not aRealmGroup:  
 | 
                aRealmGroup = g  
 | 
            if dRealmLV and dRealmLV <= gMaxRealmLV and not dRealmGroup:  
 | 
                dRealmGroup = g  
 | 
        suppressRealm = aRealmGroup - dRealmGroup  
 | 
        suppressFormulaKeyRealm = "PVPSuppressValueRealm"  
 | 
        if suppressFormulaKeyRealm in hurtDist:  
 | 
            SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula(suppressFormulaKeyRealm, hurtDist[suppressFormulaKeyRealm])))  
 | 
        #GameWorld.DebugLog("¾³½çÑ¹ÖÆ:aRealmLV=%s,dRealmLV=%s,aRealmGroup=%s,dRealmGroup=%s,SuppressValueRealmRate=%s"   
 | 
        #                   % (aRealmLV, dRealmLV, aRealmGroup, dRealmGroup, SuppressValueRealmRate))      
 | 
          
 | 
    elif atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotPlayer:  
 | 
        # EVP ¾³½çÑ¹ÖÆ  
 | 
        aRealmLV, dRealmLV = GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType)   
 | 
        if aRealmLV + dRealmLV != 0:  
 | 
            #ÓÐÑ¹ÖÆ  
 | 
            suppressRealm = aRealmLV - dRealmLV # ´æÔÚ¸ºÊý  
 | 
            suppressRealmHurtPer = GetRealmHurtPer(aRealmLV, dRealmLV, 2) # ¾³½çÑ¹ÖÆ¼Ó³É°Ù·Ö±È£¬´æÔÚ¸ºÊý  
 | 
            suppressFormulaKeyRealm = "EVPSuppressValueRealm"  
 | 
            if suppressFormulaKeyRealm in hurtDist:  
 | 
                SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula(suppressFormulaKeyRealm, hurtDist[suppressFormulaKeyRealm])))  
 | 
                  
 | 
    elif atkObjType == IPY_GameWorld.gotPlayer and defObjType == IPY_GameWorld.gotNPC:  
 | 
        # PVE ¾³½çÑ¹ÖÆ  
 | 
        aRealmLV, dRealmLV = GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType)   
 | 
        if aRealmLV + dRealmLV != 0:  
 | 
            #ÓÐÑ¹ÖÆ  
 | 
            suppressRealm = aRealmLV - dRealmLV # ´æÔÚ¸ºÊý  
 | 
            suppressRealmHurtPer = GetRealmHurtPer(aRealmLV, dRealmLV, 3) # ¾³½çÑ¹ÖÆ¼Ó³É°Ù·Ö±È£¬´æÔÚ¸ºÊý  
 | 
            suppressFormulaKeyRealm = "PVESuppressValueRealm"  
 | 
            if suppressFormulaKeyRealm in hurtDist:  
 | 
                SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula(suppressFormulaKeyRealm, hurtDist[suppressFormulaKeyRealm])))  
 | 
          
 | 
          
 | 
    # Æï³èÕù¶á×îÖÕÉ˺¦Ë¥¼õ             
 | 
    if defObjType == IPY_GameWorld.gotNPC and FamilyRobBoss.IsHorsePetRobBoss(defObj.GetNPCID()):  
 | 
        ownerPlayer = None  
 | 
        # ÕÙ»½Ê޺ͳèÎïÐèÒª´ÓÈËÎï»ñȡ״̬  
 | 
        if atkObj.GetGameObjType() == IPY_GameWorld.gotNPC:  
 | 
            if atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:  
 | 
                ownerPlayer = PetControl.GetPetOwner(atkObj)  
 | 
            elif atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotSummon:  
 | 
                ownerPlayer = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, atkObj)  
 | 
        else:  
 | 
            ownerPlayer = atkObj  
 | 
              
 | 
        if ownerPlayer:  
 | 
            findBuff = SkillCommon.FindBuffByID(ownerPlayer, ChConfig.Def_SkillID_HorsePetRobBossKillCntBuff)[0]  
 | 
            if findBuff:  
 | 
                reduceFinalHurtPer = findBuff.GetSkill().GetEffect(0).GetEffectValue(0)  
 | 
                aFinalHurtPer -= reduceFinalHurtPer  
 | 
                  
 | 
    atkStateMark = GetObjAtkStateMark(atkObj)  
 | 
    defStateMark = GetObjAtkStateMark(defObj)  
 | 
    hurtFormulaKey = "%sV%s_%s" % (atkStateMark, defStateMark, atkType)  
 | 
      
 | 
    suppressLVGroup = 0 # NPCÑ¹ÖÆµÈ¼¶×é±àºÅ  
 | 
    mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())  
 | 
    mapHurtKey = "%s_%s" % (hurtFormulaKey, mapID)  
 | 
    if mapHurtKey in hurtDist:  
 | 
        hurtFormulaKey = mapHurtKey  
 | 
    elif atkStateMark == "E" and defStateMark == "P":  
 | 
        suppressLVGroup = NPCCommon.GetIsLVSuppress(atkObj)  
 | 
    elif atkStateMark == "P" and defStateMark == "E":  
 | 
        suppressLVGroup = NPCCommon.GetIsLVSuppress(defObj)  
 | 
          
 | 
    if suppressLVGroup:  
 | 
        suppressLVHurtKey = "%s_%s" % (hurtFormulaKey, suppressLVGroup)  
 | 
        if suppressLVHurtKey in hurtDist:  
 | 
            hurtFormulaKey = suppressLVHurtKey  
 | 
      
 | 
    # ÖúÕ½»úÆ÷ÈËÌØÊâÉËѪkey  
 | 
    if helpBattleFormatKey:  
 | 
        hurtFormulaKey = helpBattleFormatKey  
 | 
          
 | 
    if hurtFormulaKey not in hurtDist:  
 | 
        GameWorld.ErrLog("CalcAttackValue.txt É˺¦¹«Ê½Î´ÅäÖÃ, key=%s" % (hurtFormulaKey))  
 | 
        return 0, ChConfig.Def_HurtType_Miss  
 | 
    hurtFormula = hurtDist[hurtFormulaKey]  
 | 
    hurtValue = int(eval(FormulaControl.GetCompileFormula(hurtFormulaKey, hurtFormula)))  
 | 
  
 | 
    if hurtType == ChConfig.Def_HurtType_Normal and SuppressValueRealmRate > 10000:  
 | 
        # ´æÔÚÑ¹ÖÆ  
 | 
        return hurtValue, ChConfig.Def_HurtType_RealmSupress  
 | 
      
 | 
    return hurtValue, hurtType  
 | 
  
 | 
# »ñÈ¡EVPºÍPVEÉ˺¦°Ù·Ö±È²î£¬PVEÎÞ¾³½çÑ¹ÖÆ, ¾³½çµÈ¼¶¶ÔÓ¦ÁбíµÄindex£¬Ô½½çÈ¡×î¸ß  
 | 
def GetRealmHurtPer(aRealmLV, dRealmLV, gridIndex):  
 | 
    suppressRealmHurtPer = 0  
 | 
    suppressRealmDict = IpyGameDataPY.GetFuncEvalCfg("RealmGroup", gridIndex)  
 | 
      
 | 
    plus_minus = 1  # ¸ºÊýΪ·´Ñ¹ÖÆ  
 | 
    if aRealmLV >= dRealmLV:  
 | 
        suppressList = range(dRealmLV+1, aRealmLV+1)  
 | 
    else:  
 | 
        suppressList = range(aRealmLV+1, dRealmLV+1)  
 | 
        plus_minus = -1  
 | 
      
 | 
      
 | 
    for realmLV in suppressList:  
 | 
        suppressRealmHurtPer += suppressRealmDict.get(realmLV, 0)  
 | 
          
 | 
    return suppressRealmHurtPer*plus_minus  
 | 
  
 | 
  
 | 
# »ñȡ˫·½¾³½çÖµ  
 | 
def GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType):  
 | 
    if atkObjType == IPY_GameWorld.gotNPC:  
 | 
        aRealmLV = NPCCommon.GetRealmLV(atkObj)  
 | 
        if aRealmLV == 0:  
 | 
            # 0´ú±í²»ÒªÑ¹ÖÆ  
 | 
            return 0, 0  
 | 
    else:  
 | 
        aRealmLV = atkObj.GetOfficialRank()  
 | 
          
 | 
    if defObjType == IPY_GameWorld.gotNPC:  
 | 
        dRealmLV = NPCCommon.GetRealmLV(defObj)  
 | 
        if dRealmLV == 0:  
 | 
            # 0´ú±í²»ÒªÑ¹ÖÆ  
 | 
            return 0, 0  
 | 
    else:  
 | 
        dRealmLV = defObj.GetOfficialRank()  
 | 
          
 | 
    return aRealmLV, dRealmLV  
 | 
  
 | 
  
 | 
## ¹¥»÷ʱʼþ´¦Àí£¬·´µ¯ÎüѪ»òÕß¶îÍâ´¥·¢¼¼ÄÜµÈ  
 | 
#  @param resultHurtType É˺¦½á¹¹Ìå  
 | 
#  @return   
 | 
def AttackEventTrigger(atkObj, defObj, curSkill, resultHurtType, tick):  
 | 
      
 | 
    #·´µ¯É˺¦  
 | 
    CalcBounceHP(atkObj, defObj, resultHurtType.LostHP, resultHurtType.HurtType)  
 | 
    #ÎüѪ  
 | 
    CalcSuckBlood(atkObj, defObj, curSkill, resultHurtType.RealHurtHP, tick)  
 | 
          
 | 
    if atkObj.GetGameObjType() == IPY_GameWorld.gotPlayer:  
 | 
        # ¼Ç¼×îºóÒ»´ÎÉ˺¦Öµ  
 | 
        atkObj.SetDict(ChConfig.Def_PlayerKey_LastHurtValue, resultHurtType.RealHurtHP)  
 | 
        if defObj.GetGameObjType() == IPY_GameWorld.gotNPC:  
 | 
            atkObj.SetDict(ChConfig.Def_PlayerKey_LastHurtNPCObjID, defObj.GetID())  
 | 
          
 | 
    return  
 | 
  
 | 
  
 | 
  
 | 
def GetObjAtkStateMark(obj):  
 | 
    objType = obj.GetGameObjType()  
 | 
    if objType == IPY_GameWorld.gotPlayer:  
 | 
        return "P"  
 | 
      
 | 
    objType = obj.GetGameNPCObjType()  
 | 
    if objType == IPY_GameWorld.gnotPet:  
 | 
        return "Pet"  
 | 
              
 | 
    return "E"  
 | 
  
 | 
## »ñÈ¡PVE,PVP¹¥»÷ÐÎʽ  
 | 
# @param None  
 | 
# @return ¹¥»÷ÐÎʽ×Ö·û´®  
 | 
def GetAtkState(atkObj, defObj):  
 | 
    isPet = PetControl.IsPet(atkObj)  
 | 
    if IsPVENPCObj(atkObj) or IsPVENPCObj(defObj):  
 | 
        return 'PVE_%s' if not isPet else 'PetVE_%s'  
 | 
      
 | 
    return 'PVP_%s' if not isPet else 'PetVP_%s'  
 | 
      
 | 
  
 | 
## ÊÇ·ñ·ÇÍæ¼ÒÏà¹ØµÄNPC  
 | 
#  @param obj  
 | 
#  @return bool  
 | 
def IsPVENPCObj(obj):  
 | 
    objType = obj.GetGameObjType()  
 | 
    if objType == IPY_GameWorld.gotPlayer:  
 | 
        return False  
 | 
      
 | 
    objType = obj.GetGameNPCObjType()  
 | 
    if objType == IPY_GameWorld.gnotPet:  
 | 
        return False  
 | 
      
 | 
    if objType == IPY_GameWorld.gnotSummon:  
 | 
        npcOwner_Player = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, obj)  
 | 
        if npcOwner_Player != None:  
 | 
            return False  
 | 
          
 | 
    return True  
 | 
      
 | 
##´¦Àí¹¥»÷ÕßµÄÉ˺¦·´µ¯ºÍÎüѪ£¬GetHurtHPÖÐÖ±½Ó´¦Àí£¬Íâ²ãÎÞ·¨Õýȷ֪ͨ·´µ¯ºÍÎüѪƮ×Ö  
 | 
##·´µ¯É˺¦Âß¼  
 | 
# @param atkObj ¹¥»÷Õß  
 | 
# @param defObj ·ÀÊØÕß  
 | 
# @param hurtValue É˺¦Öµ     
 | 
# @return None  
 | 
def CalcBounceHP(atkObj, defObj, hurtValue, hurtType):  
 | 
    if not atkObj.GetCanAttack():  
 | 
        return  
 | 
      
 | 
    #Ö»ÓÐÍæ¼Ò»á·´µ¯  
 | 
    defObjType = defObj.GetGameObjType()  
 | 
    if defObjType != IPY_GameWorld.gotPlayer:  
 | 
        return  
 | 
      
 | 
    if GameObj.GetHP(atkObj) == 1:  
 | 
        return  
 | 
      
 | 
    ##Ãþ¹Ö´ÎÊýÅÐ¶Ï  
 | 
    #if not CheckAttackNPCByCnt(defObj, atkObj, False):  
 | 
    #    GameWorld.DebugLog("²»Äܹ¥»÷£¬²»·´µ¯")  
 | 
    #    return  
 | 
    #ɱ¹Ö´ÎÊýÅÐ¶Ï  
 | 
    if not CheckKillNPCByCnt(defObj, atkObj, False):  
 | 
        #GameWorld.DebugLog("²»Äܹ¥»÷£¬²»·´µ¯")  
 | 
        return  
 | 
      
 | 
    #ûÓз´µ¯Í˳ö  
 | 
    defObj_DamageBackRate = defObj.GetDamageBackRate()  
 | 
    defObj_DamageBackRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, None, None, ChConfig.TriggerType_BounceHPPer)  
 | 
      
 | 
    bounceHP = hurtValue * defObj_DamageBackRate / float(ChConfig.Def_MaxRateValue)  
 | 
    bounceHP  = int(bounceHP + PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, None, None, ChConfig.TriggerType_BounceHP))  
 | 
    bounceHP  = int(bounceHP + PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, None, None, ChConfig.TriggerType_BounceHP))  
 | 
    if bounceHP == 0:  
 | 
        return  
 | 
      
 | 
    bounceHP = bounceHP if bounceHP < GameObj.GetHP(atkObj) else GameObj.GetHP(atkObj) - 1  
 | 
      
 | 
    # Ñª¶Ü   
 | 
    realSubHP = CalcBloodShield(atkObj, defObj, bounceHP)  
 | 
    remainHP = max(GameObj.GetHP(atkObj) - realSubHP, 1)  
 | 
      
 | 
    #curObjType = atkObj.GetGameObjType()  
 | 
    #---NPC´¦Àí---  
 | 
    atkObjType = atkObj.GetGameObjType()  
 | 
    if atkObjType == IPY_GameWorld.gotNPC:  
 | 
        #³èÎï»ØÑª  
 | 
        if atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:  
 | 
            PetControl.SetPetHP(atkObj, remainHP)  
 | 
        #ÆÕͨNPC»ØÑª  
 | 
        else:  
 | 
            GameObj.SetHP(atkObj, remainHP)  
 | 
            #¹ã²¥ÑªÁ¿  
 | 
            #atkObj.Notify_HPEx()  
 | 
      
 | 
    elif atkObjType == IPY_GameWorld.gotPlayer:  
 | 
        GameObj.SetHP(atkObj, remainHP, False)  
 | 
          
 | 
        # Ë«·½¶¼ÊÇÍæ¼Ò  
 | 
        if defObjType == IPY_GameWorld.gotPlayer:  
 | 
            OnPVPDamage(defObj, bounceHP, atkObj, "Player bounce Player")   
 | 
          
 | 
    ChangeHPView(atkObj, defObj, 0, bounceHP, ChConfig.Def_HurtType_BounceHurt)  
 | 
    return  
 | 
  
 | 
  
 | 
## ¹¥»÷Õß»ØÑªÂß¼  
 | 
#  @param atkObj ¹¥»÷Õß  
 | 
#  @param defObj ·ÀÊØÕß  
 | 
#  @return None  
 | 
def CalcSuckBlood(atkObj, defObj, curSkill, hurtValue, tick):  
 | 
  
 | 
    if atkObj.GetGameObjType() != IPY_GameWorld.gotPlayer:  
 | 
        return  
 | 
    if not hurtValue:  
 | 
        return  
 | 
      
 | 
    tick = GameWorld.GetGameWorld().GetTick()  
 | 
    if tick - atkObj.GetTickByType(ChConfig.TYPE_Player_Tick_SuckBlood) \  
 | 
        < ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_SuckBlood]:  
 | 
        return  
 | 
      
 | 
    atkObj.SetTickByType(ChConfig.TYPE_Player_Tick_SuckBlood, tick)  
 | 
      
 | 
    suckHP = 0  
 | 
      
 | 
    # É±¹Ö»ØÑª  
 | 
    if defObj.GetGameObjType() == IPY_GameWorld.gotNPC and GameObj.GetHP(defObj) <= 0:  
 | 
        suckHP += atkObj.GetKillBackHP()  
 | 
      
 | 
    # ¹¥»÷ÎüѪ  
 | 
    atkBackHP = PlayerControl.GetAtkBackHPPer(atkObj)  
 | 
    if defObj.GetGameObjType() == IPY_GameWorld.gotPlayer:  
 | 
        #PVP ¹¥»÷»ØÑª  
 | 
        atkBackHP += PlayerControl.GetPVPAtkBackHP(atkObj)  
 | 
        # °Ù·Ö±ÈÎüѪ  
 | 
        atkBackHPPer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, None, ChConfig.TriggerType_Buff_SuckBloodPer)  
 | 
        atkBackHPPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)  
 | 
          
 | 
        atkBackHP += int(hurtValue * atkBackHPPer*1.0 / ChConfig.Def_MaxRateValue)  
 | 
  
 | 
    suckHP += atkBackHP  
 | 
      
 | 
    if suckHP <= 0:  
 | 
        return  
 | 
      
 | 
    GameObj.SetHP(atkObj, min(GameObj.GetMaxHP(atkObj), GameObj.GetHP(atkObj) + suckHP), False)  
 | 
      
 | 
    ChangeHPView(atkObj, None, 0, suckHP, ChConfig.Def_HurtTYpe_Recovery)  
 | 
    return  
 | 
  
 | 
## ¹¥»÷Õß»ØÀ¶Âß¼  
 | 
#  @param atkObj ¹¥»÷Õß  
 | 
#  @param defObj ·ÀÊØÕß  
 | 
#  @return None  
 | 
def CalcSuckMagic(atkObj, defObj, hurtValue):  
 | 
  
 | 
    if atkObj.GetGameObjType() != IPY_GameWorld.gotPlayer:  
 | 
        return  
 | 
      
 | 
    tick = GameWorld.GetGameWorld().GetTick()  
 | 
    if tick - atkObj.GetTickByType(ChConfig.TYPE_Player_Tick_SuckMagic) \  
 | 
        < ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_SuckMagic]:  
 | 
        return  
 | 
      
 | 
    atkObj.SetTickByType(ChConfig.TYPE_Player_Tick_SuckMagic, tick)  
 | 
      
 | 
    suckMP = 0  
 | 
      
 | 
    # É±¹Ö»ØÀ¶  
 | 
    if defObj.GetGameObjType() == IPY_GameWorld.gotNPC and GameObj.GetHP(defObj) <= 0:  
 | 
        suckMP += atkObj.GetKillBackMP()  
 | 
      
 | 
    # ¹¥»÷ÎüÀ¶  
 | 
    atkBackMPPer = PlayerControl.GetAtkBackMPPer(atkObj)  
 | 
    if atkBackMPPer > 0:  
 | 
        suckMP += int(hurtValue * atkBackMPPer / float(ChConfig.Def_MaxRateValue))  
 | 
      
 | 
    if suckMP <= 0:  
 | 
        return  
 | 
      
 | 
    atkObj.SetMP(min(atkObj.GetMaxMP(), atkObj.GetMP() + suckMP))  
 | 
    return  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## »ñµÃÄ¿±êÊÇ·ñËÀÍö  
 | 
#  @param taget Ä¿±êObj  
 | 
#  @return True or False  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def GetIsDead(taget):  
 | 
    if not taget:  
 | 
        return True  
 | 
      
 | 
    tagetType = taget.GetGameObjType()  
 | 
      
 | 
    if tagetType == IPY_GameWorld.gotPlayer:  
 | 
        return (taget.GetPlayerAction() == IPY_GameWorld.paDie)  
 | 
      
 | 
    elif tagetType == IPY_GameWorld.gotNPC:  
 | 
        if taget.GetGameNPCObjType() == IPY_GameWorld.gnotTruck:  
 | 
            #ïÚ³µÅж¨ÊÇ·ñ¿ÉÒÔ¹¥»÷( Ë𻵵ÄïÚ³µÊÇÎ޵еĠGetCanAttack = 0 )  
 | 
            return (not taget.GetCanAttack())  
 | 
          
 | 
        return (taget.GetCurAction() == IPY_GameWorld.laNPCDie)  
 | 
      
 | 
    GameWorld.Log('###GetIsDead = %s ' % (tagetType))  
 | 
    return False  
 | 
  
 | 
def IsMaliciousAttackPlayer(curPlayer, tagPlayer):  
 | 
    # ÅжÏÄ¿±êÍæ¼ÒÊÇ·ñÊǶñÒâ¹¥»÷×Ô¼ºµÄÍæ¼Ò  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    if playerID not in PyGameData.g_maliciousAttackDict:  
 | 
        return False  
 | 
    return tagPlayer.GetPlayerID() in PyGameData.g_maliciousAttackDict[playerID].keys()  
 | 
  
 | 
def AddMaliciousAttackPlayer(atkPlayer, defPlayer, tick):  
 | 
    # Ìí¼Ó¶ñÒâ¹¥»÷Íæ¼Ò  
 | 
    atkPlayerID = atkPlayer.GetPlayerID()  
 | 
    defPlayerID = defPlayer.GetPlayerID()  
 | 
    defMaliciousAttackPlayerDict = {}  
 | 
    if defPlayerID in PyGameData.g_maliciousAttackDict:  
 | 
        defMaliciousAttackPlayerDict = PyGameData.g_maliciousAttackDict[defPlayerID]  
 | 
          
 | 
    if atkPlayerID not in defMaliciousAttackPlayerDict:  
 | 
        # Í¨ÖªÍæ¼Ò±»¶ñÒâ¹¥»÷  
 | 
        addAtkPlayerPack = ChPyNetSendPack.tagMCAddMaliciousAtkPlayer()  
 | 
        addAtkPlayerPack.AtkPlayerID = atkPlayerID  
 | 
        NetPackCommon.SendFakePack(defPlayer, addAtkPlayerPack)  
 | 
          
 | 
    defMaliciousAttackPlayerDict[atkPlayerID] = tick  
 | 
    PyGameData.g_maliciousAttackDict[defPlayerID] = defMaliciousAttackPlayerDict  
 | 
    #GameWorld.DebugLog("¶ñÒâ¹¥»÷Íæ¼Ò: atkPlayerID=%s,defPlayerID=%s,tick=%s, g_maliciousAttackDict=%s"   
 | 
    #                   % (atkPlayerID, defPlayerID, tick, PyGameData.g_maliciousAttackDict), defPlayerID)  
 | 
    return  
 | 
  
 | 
def UpdMaliciousAttackTick(atkPlayer, defPlayer, tick):  
 | 
    # ¹¥»÷¶ñÒâ¹¥»÷×Ô¼ºµÄÍæ¼Òʱ£¬¸üжñÒâ¹¥»÷tick  
 | 
    atkPlayerID = atkPlayer.GetPlayerID()  
 | 
    if atkPlayerID not in PyGameData.g_maliciousAttackDict:  
 | 
        return  
 | 
    maliciousAtkPlayerDict = PyGameData.g_maliciousAttackDict[atkPlayerID]  
 | 
    defPlayerID = defPlayer.GetPlayerID()  
 | 
    if defPlayerID not in maliciousAtkPlayerDict:  
 | 
        return  
 | 
    maliciousAtkPlayerDict[defPlayerID] = tick  
 | 
    #GameWorld.DebugLog("·´»÷¸üжñÒâ¹¥»÷Íæ¼Ò: atkPlayerID=%s,defPlayerID=%s,tick=%s, g_maliciousAttackDict=%s"   
 | 
    #                   % (atkPlayerID, defPlayerID, tick, PyGameData.g_maliciousAttackDict), atkPlayerID)  
 | 
    return  
 | 
  
 | 
def ProcessMaliciousAttackPlayer(curPlayer, tick):  
 | 
    ## Ë¢Ð¶ñÒâ¹¥»÷Íæ¼ÒÕýµ±·ÀÎÀʱ¼ä  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    if playerID not in PyGameData.g_maliciousAttackDict:  
 | 
        return  
 | 
    defendTime = IpyGameDataPY.GetFuncCfg("PKConfig", 3) * 1000 # Õýµ±·ÀÎÀʱ³¤  
 | 
    defMaliciousAttackPlayerDict = PyGameData.g_maliciousAttackDict[playerID]  
 | 
    for atkPlayerID, atkTick in defMaliciousAttackPlayerDict.items():  
 | 
        if tick - atkTick < defendTime:  
 | 
            continue  
 | 
          
 | 
        defMaliciousAttackPlayerDict.pop(atkPlayerID)  
 | 
          
 | 
        delAtkPlayerPack = ChPyNetSendPack.tagMCDelMaliciousAtkPlayer()  
 | 
        delAtkPlayerPack.AtkPlayerID = atkPlayerID  
 | 
        NetPackCommon.SendFakePack(curPlayer, delAtkPlayerPack)  
 | 
        #GameWorld.DebugLog("ɾ³ý¶ñÒâ¹¥»÷Íæ¼Ò: atkPlayerID=%s,defPlayerID=%s, g_maliciousAttackDict=%s"   
 | 
        #                   % (atkPlayerID, playerID, PyGameData.g_maliciousAttackDict), playerID)  
 | 
          
 | 
    if not defMaliciousAttackPlayerDict:  
 | 
        PyGameData.g_maliciousAttackDict.pop(playerID)  
 | 
        #GameWorld.DebugLog("    Çå¿ÕÍæ¼ÒÊܵ½µÄ¶ñÒâ¹¥»÷ÐÅÏ¢: g_maliciousAttackDict=%s" % PyGameData.g_maliciousAttackDict, playerID)  
 | 
    return  
 | 
  
 | 
  
 | 
## »ñµÃÁ½¸öÍæ¼ÒµÄ¹ØÏµ  
 | 
#  @param curPlayer ¹¥»÷·½Obj  
 | 
#  @param tagPlayer Ä¿±êObj  
 | 
#  @return ¹¥»÷·½ÓëÄ¿±êµÄ¹ØÏµ  
 | 
#  @remarks »ñµÃÁ½¸öÍæ¼ÒµÄ¹ØÏµ  
 | 
def GetPlayersRelation(curPlayer, tagPlayer):  
 | 
    '''  
 | 
    PKģʽ  
 | 
        0    ºÍƽģʽ    IPY_GameWorld.amPeace            ¶ÔËùÓÐÍæ¼Ò¶¼ÊÇÓѺ㬶ñÒâ¹¥»÷×Ô¼ºµÄÍæ¼Ò³ýÍâ  
 | 
        1    È«Ìåģʽ    IPY_GameWorld.amAll              ¶ÔËùÓÐÍæ¼Ò¶¼Êǵжԣ¬¼Ò×åÇøÓòͬÃËÍæ¼Ò³ýÍâ    
 | 
        2    ·ÀÎÀģʽ    IPY_GameWorld.amCountry          ±¾·þÍæ¼ÒÓѺã¬Ëû·þÍæ¼Ò¶¼ÊÇµÐ¶Ô  
 | 
        5    Ç¿ÖÆÄ£Ê½    IPY_GameWorld.amFamily           ¶ÓÓÑ¡¢ÏÉÃ˳ÉÔ±¡¢Í¬ÕóÓªÓѺã¬ÆäËûÍæ¼ÒµÐ¶Ô  
 | 
          
 | 
    ³¡¾°ÇøÓò  
 | 
        ÆÕÍ¨ÇøÓò    IPY_GameWorld.gatNormal    ¿É¸ù¾Ý²»Í¬PKģʽPK£¬»÷É±Íæ¼ÒÓгͷ£  
 | 
        °²È«ÇøÓò    IPY_GameWorld.gatSafe      ²»ÄÜPK  
 | 
        ×ÔÓÉÇøÓò    IPY_GameWorld.gatFreePK    ¿É¸ù¾Ý²»Í¬PKģʽPK£¬»÷É±Íæ¼ÒÎ޳ͷ£  
 | 
          
 | 
    ¼ò»¯¹ØÏµÅжÏÂß¼£º ¿É·ñ¹¥»÷È«Óɹ¥»÷ģʽ¾ö¶¨£¬²ß»®Í¨¹ýµØÍ¼Ä¬ÈÏģʽ¼°¿ÉÇл»Ä£Ê½¿ØÖÆPK¹ØÏµ  
 | 
      
 | 
    Ç±¹æÔò:  
 | 
        °²È«ÇøÓò²»¿É¹¥»÷  
 | 
        ÆÕÍ¨ÇøÓòÖÐPKÖµ´ïµ½ÉÏÏÞ²»Äܹ¥»÷±ðÈË  
 | 
        Ë«·½²»Í¬ÔÚÍ¬Ò»ÇøÓò²»¿É¹¥»÷  
 | 
        ²»¿É¹¥»÷´ò×øÖеÄÍæ¼Ò  
 | 
        ¶ñÒâ¹¥»÷×Ô¼ºµÄÍæ¼ÒÎÞÂÛʲôÇé¿ö϶¼¿É·´»÷£¬²»ÓÃÇл»Ä£Ê½  
 | 
    '''  
 | 
    #¹ØÏµÓÐ3²ã£¬ÎÞ-ÓѺÃ-µÐÈË  
 | 
    #ÅжÏÊÇ·ñ¿ÉÊÍ·Å(Ôö/¼õ)¼¼ÄÜ»òÆÕ¹¥  
 | 
    if CheckPlayersRelationInFB_IsNone(curPlayer, tagPlayer):  
 | 
        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_None  
 | 
      
 | 
    curPlayerAreaType = GameMap.GetAreaTypeByMapPos(curPlayer.GetPosX(), curPlayer.GetPosY())  # µ±Ç°Íæ¼ÒËùÔÚÇøÓò  
 | 
    tagPlayerAreaType = GameMap.GetAreaTypeByMapPos(tagPlayer.GetPosX(), tagPlayer.GetPosY())  # Ä¿±êÍæ¼ÒËùÔÚÇøÓò  
 | 
      
 | 
    #ÔÚ°²È«Çø£¬²»¿ÉPK£¬¿É¼ÓÔöÒæbuff  
 | 
    if curPlayerAreaType == IPY_GameWorld.gatSafe or tagPlayerAreaType == IPY_GameWorld.gatSafe:  
 | 
        return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_IsSafeArea  
 | 
      
 | 
    #¹¥ÊØË«·½²»ÔÚÍ¬Ò»ÇøÓò£¬²»¿ÉPK£¬²»¿É¼ÓÔöÒæbuff  
 | 
    if curPlayerAreaType != tagPlayerAreaType:  
 | 
        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_CurAreaNotPK  
 | 
      
 | 
    #·ÀÊØ·½ÊÇÔÚ´ò×ø£¬²»¿ÉPK£¬²»¿É¼ÓÔöÒæbuff  
 | 
    if tagPlayer.GetPlayerAction() == IPY_GameWorld.paSit:  
 | 
        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_SitNotPK  
 | 
      
 | 
    if GetIsNewGuy(curPlayer):  
 | 
        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_NewGuy  
 | 
      
 | 
    if GetIsNewGuy(tagPlayer):  
 | 
        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_NotAttackNewGuy  
 | 
        
 | 
    #¹¥ÊØË«·½Í¬Ò»¶ÓÎ飬²»¿ÉPK£¬¿É¼ÓÔöÒæbuff  
 | 
    #if curPlayerAreaType not in [ShareDefine.gatManor] and CanAlikeTeam(curPlayer, tagPlayer):  
 | 
    #    #¸±±¾¶ÓÓÑÌØÊâÅÐ¶Ï  
 | 
    #    if not PlayerCanAttackTeamerInFB(curPlayer, tagPlayer):   
 | 
    #        return ChConfig.Type_Relation_Friend , ChConfig.Def_PASysMessage_NotAttackTeam  
 | 
          
 | 
    #¶ñÒâ¹¥»÷µÄÍæ¼ÒĬÈ϶¼ÊǵÐÈË, ÎÞÂÛʲôģʽ  
 | 
    if IsMaliciousAttackPlayer(curPlayer, tagPlayer):  
 | 
        return ChConfig.Type_Relation_Enemy, ChConfig.Def_PASysMessage_None  
 | 
      
 | 
    #»ñµÃÍæ¼Ò¹¥»÷ģʽ  
 | 
    curPlayerAttackMode = curPlayer.GetAttackMode()  
 | 
    if curPlayerAttackMode == IPY_GameWorld.amPeace:  
 | 
        return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_AttackMode  
 | 
      
 | 
    # Ç¿ÖÆÄ£Ê½(²»¿É¹¥»÷ͬ¶ÓÎ顢ͬÏÉÃË¡¢Í¬ÕóÓªÍæ¼Ò)  
 | 
    elif curPlayerAttackMode == IPY_GameWorld.amFamily:  
 | 
        if CanAlikeTeam(curPlayer, tagPlayer):  
 | 
            return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_NotAttackTeam  
 | 
        if CanAlikeFamily(curPlayer, tagPlayer):  
 | 
            return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_NotAttackFamily  
 | 
        if CanAlikeFaction(curPlayer, tagPlayer):  
 | 
            return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_NotAttackFaction  
 | 
          
 | 
    # ·ÀÎÀģʽ(²»¿É¹¥»÷ͬ·þÍæ¼Ò)  
 | 
    elif curPlayerAttackMode == IPY_GameWorld.amCountry:  
 | 
        if IsSameServer(curPlayer, tagPlayer):  
 | 
            return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_NotAttackServer  
 | 
          
 | 
    # È«Ìåģʽ  
 | 
    elif curPlayerAttackMode == IPY_GameWorld.amAll:  
 | 
        pass  
 | 
      
 | 
    # ÒÔÏÂΪËùÊôÇøÓòµÄÒ»Ð©ÌØÊâ´¦Àí  
 | 
    #ÆÕÍ¨Çø  
 | 
    if curPlayerAreaType == IPY_GameWorld.gatNormal:  
 | 
        # ¹¥»÷·½PKÖµ´óÓÚ×î´óPKÖµ£¬²»¿ÉPK£¬¿É¼ÓÔöÒæbuff  
 | 
        if curPlayer.GetPKValue() >= PlayerControl.GetMaxPKValue():  
 | 
            return ChConfig.Type_Relation_Friend , ChConfig.Def_PASysMessage_AttackNotPK  
 | 
          
 | 
        # Ä¿±êÎÞPKÖµµÄÏíÊÜPK±£»¤Ê±¼ä  
 | 
        if not tagPlayer.GetPKValue() and IsPKProtectTime():  
 | 
            return ChConfig.Type_Relation_Friend , ChConfig.Def_PASysMessage_PKProtectTime  
 | 
          
 | 
    if CheckPlayersRelationInFB_IsFriend(curPlayer, tagPlayer):  
 | 
        return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_None  
 | 
      
 | 
    #µÐÈ˹ØÏµ£¬¿ÉPK£¬¿É¼Ó¼õÒæbuff  
 | 
    return ChConfig.Type_Relation_Enemy , ChConfig.Def_PASysMessage_None  
 | 
  
 | 
## »ñÈ¡Íæ¼ÒºÍïÚ³µµÄ¹ØÏµ  
 | 
#  @param curPlayer: ¹¥»÷·½ÊµÀý  
 | 
#  @param curTagTruck: ïÚ³µÊµÀý  
 | 
#  @return: ¿É·ñ¹¥»÷  
 | 
def GetPlayerAndTruckRelation(curPlayer, curTagTruck):  
 | 
      
 | 
    if curPlayer == None or curTagTruck == None:  
 | 
        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_None  
 | 
      
 | 
    #¹¥»÷·½Íæ¼ÒÇøÓò  
 | 
    curPlayerAreaType = GameMap.GetAreaTypeByMapPos(curPlayer.GetPosX(), curPlayer.GetPosY())  
 | 
      
 | 
    #ïÚ³µËùÔÚÇøÓò  
 | 
    truckAreaType = GameMap.GetAreaTypeByMapPos(curTagTruck.GetPosX(), curTagTruck.GetPosY())  
 | 
      
 | 
    #¹¥»÷·½»òïÚ³µÔÚ°²È«Çø  
 | 
    if curPlayerAreaType == IPY_GameWorld.gatSafe or truckAreaType == IPY_GameWorld.gatSafe:  
 | 
        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_IsSafeArea  
 | 
      
 | 
    #¹¥ÊØË«·½²»ÔÚÍ¬Ò»ÇøÓò£¬²»¿ÉPK£¬²»¿É¼ÓÔöÒæbuff  
 | 
    if curPlayerAreaType != truckAreaType:  
 | 
        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_CurAreaNotPK  
 | 
      
 | 
    curTagPlayer = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, curTagTruck)  
 | 
    if curTagPlayer:  
 | 
        if curPlayer.GetID() == curTagPlayer.GetID():  
 | 
            #²»Äܹ¥»÷×Ô¼ºµÄïÚ³µ  
 | 
            return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_None  
 | 
  
 | 
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Truck):  
 | 
        #Truck_hgg_31379:¹¦ÄÜ먦Æô,²»Äܹ¥»÷ïÚ³µ  
 | 
        PlayerControl.NotifyCode(curPlayer, "Truck_hgg_31379", [GameFuncComm.GetFuncLimitLV(ShareDefine.GameFuncID_Truck)])     
 | 
        return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_None  
 | 
          
 | 
    curTruckOTeamID = PlayerTruck.GetTruckTeamID(curTagTruck)  
 | 
    curTruckFamilyID = PlayerTruck.GetTruckFamilyID(curTagTruck)  
 | 
    curTruckNameColor = PlayerTruck.GetTruckNameColor(curTagTruck)  
 | 
      
 | 
    #ÆÕÍ¨ÇøÓò  
 | 
    if curPlayerAreaType == IPY_GameWorld.gatNormal:  
 | 
        #ºÍƽģʽ  
 | 
        if curPlayer.GetAttackMode() == IPY_GameWorld.amPeace :  
 | 
            #ÈçïÚ³µÖ÷È˲»ÊǺìÃûÒ²²»ÊÇ»ÆÃû£¬Ôò¸øÏµÍ³Ìáʾ£º²»¿É¹¥»÷  
 | 
            if curTruckNameColor not in [IPY_GameWorld.pncGray, IPY_GameWorld.pncRed]:  
 | 
                return ChConfig.Type_Relation_Friend , ChConfig.Def_PASysMessage_CurAreaNotPK  
 | 
              
 | 
    curPlayerTeamID = curPlayer.GetTeamID()  # ¹¥»÷·½¶ÓÎéID  
 | 
    curPlayerFamilyID = curPlayer.GetFamilyID()  # ¹¥»÷·½¼Ò×åID  
 | 
    if curPlayerTeamID and curTruckOTeamID and curTruckOTeamID == curPlayerTeamID:  
 | 
        #¹¥»÷·½ºÍïÚ³µÖ÷ÈËͬ¶ÓÎé  
 | 
        return ChConfig.Type_Relation_Friend , ChConfig.Def_PASysMessage_NotAttackTeam  
 | 
      
 | 
    if curTruckFamilyID and curPlayerFamilyID and curTruckFamilyID == curPlayerFamilyID:  
 | 
        #¹¥»÷·½ºÍïÚ³µÖ÷ÈËͬ¼Ò×å  
 | 
        return ChConfig.Type_Relation_Friend , ChConfig.Def_PASysMessage_NotAttackFamily  
 | 
      
 | 
    return ChConfig.Type_Relation_Enemy, ChConfig.Def_PASysMessage_None  
 | 
  
 | 
def IsPKProtectTime():  
 | 
    ## ÊÇ·ñÊÇPK±£»¤Ê±¼ä¶Î  
 | 
    pkProtecTimeList = IpyGameDataPY.GetFuncEvalCfg("PKConfig", 1)  
 | 
    if not pkProtecTimeList:  
 | 
        return False  
 | 
      
 | 
    startTime, endTime = pkProtecTimeList  
 | 
    startHour, startMinute = startTime  
 | 
    endHour, endMinute = endTime  
 | 
      
 | 
    curTime = GameWorld.GetCurrentTime()  
 | 
    curYear, curMonth, curDay = curTime.year, curTime.month, curTime.day  
 | 
      
 | 
    startDateTime = datetime.datetime(curYear, curMonth, curDay, startHour, startMinute, 0)  
 | 
    endDateTime = datetime.datetime(curYear, curMonth, curDay, endHour, endMinute, 0)  
 | 
      
 | 
    if curTime >= startDateTime or curTime <= endDateTime:  
 | 
        return True  
 | 
    return False  
 | 
  
 | 
def IsSameServer(curPlayer, curTagPlayer):  
 | 
    # ÊÇ·ñͬ·þÍæ¼Ò  
 | 
    # ÔÝʱֱ½Ó·µ»ØTrue£¬×ö¿ç·þʱÔÙ´¦Àí  
 | 
    return True  
 | 
  
 | 
## ÊÇ·ñͬÕóÓª  
 | 
#  @param curPlayer: Íæ¼ÒʵÀý  
 | 
#  @param curTagPlayer: Ä¿±êÍæ¼ÒʵÀý  
 | 
#  @return: ÊÇ·ñͬÕóÓª  
 | 
def CanAlikeFaction(curPlayer, curTagPlayer):  
 | 
    curFaction = curPlayer.GetFaction()  # ÕóÓª  
 | 
    tagFaction = curTagPlayer.GetFaction()  # ÕóÓª  
 | 
    return curFaction and tagFaction and curFaction == tagFaction  
 | 
  
 | 
## ÊÇ·ñͬ¼Ò×å  
 | 
#  @param curPlayer: Íæ¼ÒʵÀý  
 | 
#  @param curTagPlayer: Ä¿±êÍæ¼ÒʵÀý  
 | 
#  @return: ÊÇ·ñͬ¼Ò×å  
 | 
def CanAlikeFamily(curPlayer, curTagPlayer):  
 | 
    curFamilyID = curPlayer.GetFamilyID()  # ¼Ò×å  
 | 
    tagFamilyID = curTagPlayer.GetFamilyID()  # ¼Ò×å  
 | 
    return curFamilyID and tagFamilyID and curFamilyID == tagFamilyID  
 | 
  
 | 
## ÊÇ·ñͬ¶ÓÎé  
 | 
#  @param curPlayer: Íæ¼ÒʵÀý  
 | 
#  @param curTagPlayer: Ä¿±êÍæ¼ÒʵÀý  
 | 
#  @return: ÊÇ·ñͬ¶ÓÎé  
 | 
def CanAlikeTeam(curPlayer, curTagPlayer):  
 | 
    curPlayerTeamID = curPlayer.GetTeamID()  
 | 
    curTagTeamID = curTagPlayer.GetTeamID()  
 | 
    return curPlayerTeamID and curTagTeamID and curPlayerTeamID == curTagTeamID  
 | 
#---------------------------------------------------------------------  
 | 
##´¦Àí¶ÔÏóËÀÍöÂß¼  
 | 
# @param curObjDetel ¶ÔÏóʵÀý  
 | 
# @return ·µ»ØÖµÎÞÒâÒå  
 | 
# @remarks Àí¶ÔÏóËÀÍöÂß¼  
 | 
def DoLogic_ObjDead(atkObj, curObjDetel, curSkill, tick):  
 | 
    if GameObj.GetHP(curObjDetel) > 0:  
 | 
        return  
 | 
      
 | 
    #---Íæ¼Ò´¦Àí---  
 | 
    if curObjDetel.GetGameObjType() == IPY_GameWorld.gotPlayer:  
 | 
        playerControl = PlayerControl.PlayerControl(curObjDetel)  
 | 
        playerControl.SetDead()  
 | 
        return  
 | 
      
 | 
    #---NPC´¦Àí---  
 | 
    if not ChNPC.OnCheckCanDie(atkObj, curObjDetel, curSkill, tick):  
 | 
        return  
 | 
      
 | 
    npcControl = NPCCommon.NPCControl(curObjDetel)  
 | 
    npcControl.SetKilled()  
 | 
    return  
 | 
  
 | 
  
 | 
## ¸øÓèÍæ¼Ò»÷É±Íæ¼Ò½±Àø  
 | 
#  @param curPlayer: ¹¥»÷·½  
 | 
#  @param defender: ·ÀÊØ·½  
 | 
#  @param tick: Ê±¼ä´Á  
 | 
#  @return: None  
 | 
def __GiveKill_Player_ValuePrize(curPlayer, defender, tick):  
 | 
    mapType = GameWorld.GetMap().GetMapFBType()  
 | 
      
 | 
    mapID = GameWorld.GetMap().GetMapID()  
 | 
     
 | 
          
 | 
    # ·Ç¸±±¾µØÍ¼²Å¸ø½±Àø  
 | 
    if mapType != IPY_GameWorld.fbtNull:  
 | 
        GameWorld.DebugLog("    __GiveKill_Player_ValuePrize ¸±±¾µØÍ¼É±È˲»¸ø½±Àø£¡£¡£¡")  
 | 
        return  
 | 
  
 | 
    attackLV = curPlayer.GetLV()    # ¹¥»÷Õߵȼ¶  
 | 
    attackPrestige = PlayerControl.GetPrestige(curPlayer)    # ¹¥»÷ÕßÍþÍû  
 | 
    attackNotoriety = curPlayer.GetInfamyValue()    # ¹¥»÷Õß¶ñÃûÖµ  
 | 
    attackPkValue = curPlayer.GetPKValue()  # ¹¥»÷ÕßpkÖµ  
 | 
    attackFightPower = curPlayer.GetFightPower() # ¹¥»÷ÕßÕ½¶·Á¦  
 | 
      
 | 
    defendLV = defender.GetLV()    # ·ÀÊØÕߵȼ¶  
 | 
    defendPrestige = PlayerControl.GetPrestige(defender)    # ·ÀÊØÕßÍþÍû  
 | 
    defendNotoriety = defender.GetInfamyValue()    # ·ÀÊØÕß¶ñÃûÖµ  
 | 
    defendPkValue = defender.GetPKValue()  # ·ÀÊØÕßpkÖµ  
 | 
    defendFightPower = defender.GetFightPower() # ·ÀÊØÕßÕ½¶·Á¦  
 | 
      
 | 
#    #½ñÈÕɱÈË»ñµÃÍþÍûÖµ  
 | 
#    prestigeByDay = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_KillPlayerAddPrestige)  
 | 
#      
 | 
#    addPrestige = int(eval(ReadChConfig.GetChConfig("KillPlayerPrestige")))  
 | 
#    if addPrestige > 0:  
 | 
#        maxPrestigeByDay = ReadChConfig.GetEvalChConfig("KillPlayerMaxPrestigeByDay")  
 | 
#        if prestigeByDay < maxPrestigeByDay:  
 | 
#            #û³¬¹ýÿÈÕɱÈË»ñµÃÍþÍû×î´óÖµ, ¸øÓèÍþÍû  
 | 
#            addPrestige = min(addPrestige, maxPrestigeByDay - prestigeByDay)  
 | 
#            PlayerPrestigeSys.AddPrestigeOffcialLV(curPlayer, addPrestige, ChConfig.Def_AddPrestige_Kill)  
 | 
#            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_KillPlayerAddPrestige, prestigeByDay + addPrestige)  
 | 
#        else:  
 | 
#            #GeRen_wll_0:½ñÈÕ»ñµÃÍþÍûÒÑ´ïÉÏÏÞ  
 | 
#            PlayerControl.NotifyCode(curPlayer, "PK_liubo_372238")  
 | 
#              
 | 
#    elif addPrestige < 0:  
 | 
#        GameWorld.ErrLog("KillPlayerPrestige¼ÆËã½á¹û£º%s" % addPrestige)  
 | 
      
 | 
    #¶ñÃûÖµ      
 | 
    curPlayer.SetInfamyValue(min(attackNotoriety + ChConfig.Def_KillValue_Notoriety,  
 | 
                             ChConfig.Def_UpperLimit_DWord))  
 | 
      
 | 
    #»îÔ¾¶È  
 | 
#    activeByDay = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_KillPlayerAddActive)  
 | 
#    addActiveValue = int(eval(ReadChConfig.GetChConfig("KillPlayerFamilyAvtive")))  
 | 
#    if addActiveValue > 0 and curPlayer.GetFamilyID() != 0:  
 | 
#        maxAvtiveByDay = ReadChConfig.GetEvalChConfig("KillPlayerMaxAvtiveByDay")  
 | 
#        if activeByDay < maxAvtiveByDay:  
 | 
#            addActiveValue = min(addActiveValue, maxAvtiveByDay - activeByDay)  
 | 
#            PlayerFamily.AddPlayerFamilyActiveValue(curPlayer, addActiveValue, True, \  
 | 
#                                                    PlayerFamily.Def_AddFAVReason_KillPlayer)  
 | 
#            PlayerControl.NotifyCode(curPlayer, "GeRen_admin_425673", [addActiveValue])  
 | 
#            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_KillPlayerAddActive, activeByDay + addActiveValue)  
 | 
#        else:  
 | 
#            PlayerControl.NotifyCode(curPlayer, "PK_liubo_161795")              
 | 
#  
 | 
#    elif addActiveValue < 0:  
 | 
#        GameWorld.ErrLog("KillPlayerFamilyAvtive¼ÆËã½á¹û£º%s" % addActiveValue)  
 | 
  
 | 
    #---·ÀÊØÕß  
 | 
    #ÍþÍûÖµ  
 | 
#    lostPrestige = int(eval(ReadChConfig.GetChConfig("BeKilledPlayerPrestige")))  
 | 
#    if lostPrestige > 0:  
 | 
#        PlayerPrestigeSys.SubPrestigeOffcialLV(defender, lostPrestige, ChConfig.Def_SubPrestige_BeKilled)  
 | 
#    elif lostPrestige < 0:  
 | 
#        GameWorld.ErrLog("BeKilledPlayerPrestige¼ÆËã½á¹û£º%s" % lostPrestige)  
 | 
          
 | 
    #¶ñÃûÖµ  
 | 
    defender.SetInfamyValue(max(defendNotoriety - ChConfig.Def_BeKilledValue_Notoriety, 0))  
 | 
    return  
 | 
  
 | 
  
 | 
## Åж¨Ë«·½Ö®¼äÓÐÕϰµãÊÇ·ñ¿É¹¥»÷£¬Ö»ÓÐBOSS ¿É¹¥»÷  
 | 
#  @param None  
 | 
#  @return bool  
 | 
def CanAttackByPath(attacker, defender):  
 | 
    #boss ²»ÑéÖ¤Õϰµã  
 | 
    if attacker.GetGameObjType() == IPY_GameWorld.gotNPC:  
 | 
        if attacker.GetIsBoss() >= ChConfig.Def_NPCType_Boss_Blue:  
 | 
            return True  
 | 
          
 | 
    #Íæ¼ÒºÍС¹ÖÖ®¼äÓÐÕϰµã²»¿É¹¥»÷  
 | 
    canLineTo = GameWorld.GetMap().CanLineTo(attacker.GetPosX(), attacker.GetPosY(),  
 | 
                                 defender.GetPosX(), defender.GetPosY())  
 | 
      
 | 
    if attacker.GetGameObjType() == IPY_GameWorld.gotPlayer and not canLineTo:  
 | 
        PlayerControl.NotifyCode(attacker, "PK_liubo_827276")  
 | 
          
 | 
    return canLineTo  
 | 
  
 | 
  
 | 
# ÑªÁ¿±ä»¯Æ®ÑªÍ¨Öª  
 | 
def ChangeHPView(curObj, srcObj,skillID, changeHP, changType):  
 | 
    srcID, srcType = 0, 0  
 | 
    if srcObj:  
 | 
        srcID, srcType = srcObj.GetID(), srcObj.GetGameObjType()  
 | 
    HPEx = 0 if not hasattr(curObj, "GetHPEx") else curObj.GetHPEx()  
 | 
    curObj.ChangeHPView(skillID, changeHP, changType, srcID, srcType, curObj.GetHP(), HPEx)  
 | 
    return 
 |