#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#  
 | 
##@package E:/GameSVN/U3DGame/ProjectSServer/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py  
 | 
# @todo:   
 | 
#  
 | 
# @author: Alee  
 | 
# @date 2017-10-24 ÏÂÎç07:49:45  
 | 
# @version 1.0  
 | 
#  
 | 
# @note:   
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
import ShareDefine  
 | 
import ChConfig  
 | 
import IPY_GameWorld  
 | 
import IpyGameDataPY  
 | 
import SkillCommon  
 | 
  
 | 
# ¹ØÓÚѪÁ¿µÄº¯ÊýÕâÀïÖ»°ü×°×î¼òµ¥µÄ³¬DWORD´¦Àí  
 | 
  
 | 
def GetMaxHP(gameObj):  
 | 
    if not hasattr(gameObj, "GetMaxHPEx"):  
 | 
        return gameObj.GetMaxHP()  
 | 
      
 | 
    else:  
 | 
        return gameObj.GetMaxHPEx()*ShareDefine.Def_PerPointValue + gameObj.GetMaxHP()  
 | 
  
 | 
  
 | 
def SetMaxHP(gameObj, value):  
 | 
    if not hasattr(gameObj, "SetMaxHPEx"):  
 | 
        gameObj.SetMaxHP(value)  
 | 
      
 | 
    else:  
 | 
        gameObj.SetMaxHPEx(value/ShareDefine.Def_PerPointValue)  
 | 
        gameObj.SetMaxHP(value%ShareDefine.Def_PerPointValue)  
 | 
  
 | 
  
 | 
def GetHP(gameObj):  
 | 
    if not hasattr(gameObj, "GetHPEx"):  
 | 
        return gameObj.GetHP()  
 | 
      
 | 
    else:  
 | 
        return gameObj.GetHPEx()*ShareDefine.Def_PerPointValue + gameObj.GetHP()  
 | 
  
 | 
  
 | 
def SetHP(gameObj, value, isNotify=True, isByTime=False):  
 | 
    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:  
 | 
        gameObj.SetHP(value, isNotify)  
 | 
    else:  
 | 
        if gameObj.GetGameObjType() == IPY_GameWorld.gotNPC:  
 | 
            npcID = gameObj.GetNPCID()  
 | 
            if IpyGameDataPY.GetIpyGameDataNotLog("NPCTimeLostHP", npcID) and not isByTime and value not in [GetMaxHP(gameObj), 0]:  
 | 
                #GameWorld.DebugLog("²»ÄÜÉèÖð´Ê±¼äµôѪµÄ¹ÖÎïѪÁ¿! id=%s,npciD=%s,value=%s,isByTime=%s" % (gameObj.GetID(), gameObj.GetNPCID(), value, isByTime))  
 | 
                return  
 | 
        gameObj.SetHPEx(value/ShareDefine.Def_PerPointValue)  
 | 
        gameObj.SetHP(value%ShareDefine.Def_PerPointValue)  
 | 
          
 | 
          
 | 
## ÉèÖÃbuff״̬(½Å±¾×Ô¶¨Òåö¾Ù)  
 | 
#  @param pyState ×´Ì¬  
 | 
#  @param isTrue ÊÇ·ñÉèÖøÃ״̬  
 | 
#  @return None  
 | 
def SetPyPlayerState(gameObj, pyState, isAdd):  
 | 
    if pyState == 0:  
 | 
        return  
 | 
    if pyState not in ChConfig.Def_PlayerStateList:  
 | 
        return  
 | 
      
 | 
    curState = gameObj.GetDictByKey(ChConfig.Def_PlayerKey_CurState)  
 | 
    if isAdd:  
 | 
        # Ôö¼Ó  
 | 
        updState = curState | pow(2, pyState)  
 | 
    else:  
 | 
        # É¾³ý  
 | 
        if curState & pow(2, pyState) == 0:  
 | 
            return  
 | 
        else:  
 | 
            updState = curState ^ pow(2, pyState)  
 | 
  
 | 
      
 | 
    #GameWorld.DebugLog("SetPyPlayerState (%s - %s), curState=%s,updState=%s"   
 | 
    #                   % (pyState, isAdd, curState, updState))  
 | 
    gameObj.SetDict(ChConfig.Def_PlayerKey_CurState, updState)  
 | 
    return  
 | 
  
 | 
## »ñÈ¡buff״̬(½Å±¾×Ô¶¨Òåö¾Ù)  
 | 
#  @param pyState ×´Ì¬  
 | 
#  @return ÊÇ·ñ¸Ã״̬  
 | 
#  @remarks ¸Ã״̬Ϊbuff¶ÔÓ¦µÄ×Ô¶¨Òå״̬Ч¹û  
 | 
  
 | 
#===============================================================================  
 | 
# ´ËÎÊÌâÔÚ4012 Ïûʧʱ´¦Àí  
 | 
# #  Ä¿Ç°µ±Ä¿±êÉíÉ϶à¸öbuff¶¼ÓÐͬһЧ¹ûʱ(È綨Éí)£¬ÔÚÒ»¸öbuffÏûʧʱ»á½â³ý¸Ã״̬  
 | 
# #  ¹Ê¸Ã״̬±ê¼Ç½öΪһ¸ö·Ç¾«È·µÄ±ê¼Ç£¬Ó¦ÓÃÖÐÇë×¢Ò⣡£¡£¡(µ±ÇÒ½öµ±¶à¸öbuffÓÐͬһ¸öЧ¹ûʱ»áÌáǰ½áÊø¸Ã״̬)  
 | 
#===============================================================================  
 | 
def GetPyPlayerState(gameObj, pyState, ownerID = 0, ownerType = 0):  
 | 
    if not gameObj:  
 | 
        return False  
 | 
    if pyState == 0:  
 | 
        # 0²»ÐèÒªÅÐ¶Ï  
 | 
        return True  
 | 
    curState = gameObj.GetDictByKey(ChConfig.Def_PlayerKey_CurState)  
 | 
      
 | 
    state = curState & pow(2, pyState)   
 | 
      
 | 
    if state and ownerID:  
 | 
        # ½øÒ»²½ÅжÏÊÇ·ñÊÍ·ÅÕß  
 | 
        return True if IsInStateEffectByOwner(gameObj, ChConfig.Def_Skill_Effect_BuffState, pyState, ownerID, ownerType) else False  
 | 
    return state  
 | 
  
 | 
# ´óÓÚµÈÓÚ2¸ö״̬ Ôò²»ÇåÀí״̬  
 | 
def IsInStateEffectByOwner(curObj, effectID, stateType, ownerID, ownerType):  
 | 
      
 | 
    for buffType in xrange(IPY_GameWorld.bfBuff, IPY_GameWorld.btBufMax):  
 | 
        if buffType in ChConfig.Def_BuffType_OnlyPlayer:  
 | 
            continue  
 | 
          
 | 
        buffTuple = SkillCommon.GetBuffManagerByBuffType(curObj, buffType)  
 | 
        #ͨ¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷Ϊ¿Õ£¬ÔòÌø³ö  
 | 
        if buffTuple == ():  
 | 
            continue  
 | 
      
 | 
        buffManager = buffTuple[0]  
 | 
          
 | 
        for i in range(buffManager.GetEffectCount()):  
 | 
            effect = buffManager.GetEffect(i)  
 | 
            if not effect:  
 | 
                continue  
 | 
              
 | 
            if effect.GetEffectID() != effectID:  
 | 
                continue  
 | 
              
 | 
            if effect.GetEffectValue(0) != stateType:  
 | 
                continue  
 | 
              
 | 
            if buffManager.GetEffectOwnerID(i) != ownerID:  
 | 
                continue  
 | 
              
 | 
            if buffManager.GetEffectOwnerType(i) != ownerType:  
 | 
                continue  
 | 
              
 | 
            return True  
 | 
    return False  
 | 
  
 | 
  
 | 
def ClearPyPlayerState(gameObj):  
 | 
    gameObj.SetDict(ChConfig.Def_PlayerKey_CurState, 0)  
 | 
    return  
 | 
  
 | 
def GetPetDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetDamPer)  
 | 
def SetPetDamPer(gameObj, value):   
 | 
    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrPetDamPer, value)  
 | 
    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:  
 | 
        gameObj.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_PetDamPer, value, False)  
 |