From b795c5a06e99e22d74e078e033254b01455194b1 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期二, 11 六月 2019 11:32:00 +0800
Subject: [PATCH] 7200 【开发】宗门试炼修改为正常的最终通关时间决定品级

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py |   82 +++++++++++++++++++++++++++++++++++++---
 1 files changed, 75 insertions(+), 7 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
index c779b70..c67d95b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
+++ b/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)

--
Gitblit v1.8.0