ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
@@ -15,6 +15,8 @@
import ShareDefine
import ChConfig
import IPY_GameWorld
import IpyGameDataPY
import SkillCommon
# 关于血量的函数这里只包装最简单的超DWORD处理
@@ -43,10 +45,15 @@
        return gameObj.GetHPEx()*ShareDefine.Def_PerPointValue + gameObj.GetHP()
def SetHP(gameObj, value, isNotify=True):
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)
        
@@ -55,14 +62,18 @@
#  @param pyState ״̬
#  @param isTrue 是否设置该状态
#  @return None
def SetPyPlayerState(gameObj, pyState, isTrue):
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 isTrue:
    if isAdd:
        # 增加
        updState = curState | pow(2, pyState)
    else:
        # 删除
        if curState & pow(2, pyState) == 0:
            return
        else:
@@ -70,7 +81,7 @@
    
    #GameWorld.DebugLog("SetPyPlayerState (%s - %s), curState=%s,updState=%s" 
    #                   % (pyState, isTrue, curState, updState))
    #                   % (pyState, isAdd, curState, updState))
    gameObj.SetDict(ChConfig.Def_PlayerKey_CurState, updState)
    return
@@ -78,11 +89,68 @@
#  @param pyState ״̬
#  @return 是否该状态
#  @remarks 该状态为buff对应的自定义状态效果
#  目前当目标身上多个buff都有同一效果时(如定身),在一个buff消失时会解除该状态
#  故该状态标记仅为一个非精确的标记,应用中请注意!!!(当且仅当多个buff有同一个效果时会提前结束该状态)
def GetPyPlayerState(gameObj, pyState):
#===============================================================================
# 此问题在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)