From e781de21766e3ea4e768eaa9ebab2fc9a694cefe Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期五, 21 十二月 2018 21:10:27 +0800
Subject: [PATCH] 5539 【后端】【1.4】聚魂副本怪物和守卫成长支持新的成长公式

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dogz.py |   96 +++++++++++++++++++++++++++++++++---------------
 1 files changed, 66 insertions(+), 30 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dogz.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dogz.py
index 6dc06e1..0afc7a7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dogz.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dogz.py
@@ -24,24 +24,26 @@
 import GameObj
 import time
 import random
+import ChConfig
 
 
-#{(标识点):[npcid,单个点数量,刷新间隔秒, 每次刷新只数, 第一次刷新只数]}
-#{(101,102,103):[20302001,1,'20', 2, 10]}
+#{(标识点):[npcid,单个点数量,刷新间隔秒, 每次刷新只数, 第一次刷新只数, 总个数上限]}
+#{(101,102,103):[20302001,1,'20', 2, 10,30]}
 (
 Def_NPCID,
 Def_MaxCnt,
 Def_TimeFormula,
 Def_RefreshCnt,
-Def_FirstRefreshCnt
-) = range(5)
+Def_FirstRefreshCnt,
+Def_TotalLimit,
+) = range(6)
 
 Map_Dogzfb_LastRefreshTime = "Dogzfb_LastRefreshTime%s"  # 刷新时间 参数npcid
 Map_Dogzfb_NextNeedTime = "NextNeedTime%s"  # 下次刷新需要时间 参数npcid
 Map_Dogzfb_LastCheckTick = "LastCheckTick"  # 上次检查时间
 Map_Dogzfb_NPCRemainCnt = 'NPCRemainCnt_%s'   # NPC剩余数量
-Map_Dogzfb_CollectLostHPTick = 'CollectLostHPTick'   # 采集掉线Tick
-
+Map_Dogzfb_CollectLostHPTick = 'CollectLostHPTick'   # 采集掉血Tick
+Map_Dogzfb_CollectLostHPCnt = 'CollectLostHPCnt'   # 采集掉血次数
 
 ## 是否能够通过活动查询进入
 #  @param curPlayer 玩家实例
@@ -104,6 +106,18 @@
     
     return
 
+## 开始采集
+#  @param curPlayer 当前玩家
+#  @param curNPC 当前NPC
+#  @return None or False
+#  @remarks 函数详细说明.
+def OnBeginCollect(curPlayer, curNPC):
+    playerID = curPlayer.GetID()
+    tick = GameWorld.GetGameWorld().GetTick()
+    gameFB = GameWorld.GetGameFB()
+    gameFB.SetPlayerGameFBDict(playerID, Map_Dogzfb_CollectLostHPTick, tick)
+    gameFB.SetPlayerGameFBDict(playerID, Map_Dogzfb_CollectLostHPCnt, 0)
+    return
 
 ## 收集中
 def OnCollecting(curPlayer, tick):
@@ -115,19 +129,23 @@
     
     curNPC = GameWorld.GetNPCManager().GetNPCByIndex(tagObj.GetIndex())
     npcID = curNPC.GetNPCID()
+    __DoCollectLostHP(curPlayer, npcID, tick)
+    return
+
+def __DoCollectLostHP(curPlayer, npcID, tick):
+    
+    
     playerID = curPlayer.GetID()
     gameFB = GameWorld.GetGameFB()
     collectLostHPTick = gameFB.GetPlayerGameFBDictByKey(playerID, Map_Dogzfb_CollectLostHPTick)
-
+    lostHPCnt = gameFB.GetPlayerGameFBDictByKey(playerID, Map_Dogzfb_CollectLostHPCnt)
+    
     lostCD = IpyGameDataPY.GetFuncEvalCfg('DogzFBCollect', 1, {}).get(npcID, 1)
-    lostTime = (tick - collectLostHPTick) / 1000/lostCD # 掉血次数
-    if lostTime >3:
-        gameFB.SetPlayerGameFBDict(playerID, Map_Dogzfb_CollectLostHPTick, tick)
-        return
+    lostTime = (tick - collectLostHPTick) / (1000*lostCD)-lostHPCnt
     
     if not lostTime:
         return
-    gameFB.SetGameFBDict(Map_Dogzfb_CollectLostHPTick, tick)
+    gameFB.SetPlayerGameFBDict(playerID, Map_Dogzfb_CollectLostHPCnt, lostHPCnt+lostTime)
         
    
     lostHPPer = IpyGameDataPY.GetFuncEvalCfg('DogzFBCollect', 2, {}).get(npcID, 1)
@@ -135,10 +153,18 @@
     lostValue = min(int(GameObj.GetMaxHP(curPlayer) * lostHPPer / 100.0) * lostTime, GameObj.GetHP(curPlayer)-1)
     if lostValue <=0:
         return
-    #GameWorld.DebugLog("OnCollecting npcID=%s, lostHPPer=%s,lostTime=%s,lostValue=%s" % (npcID, lostHPPer, lostTime, lostValue))
+    GameWorld.DebugLog("OnCollecting npcID=%s, lostHPPer=%s,lostTime=%s,lostValue=%s" % (npcID, lostHPPer, lostTime, lostValue))
     SkillCommon.SkillLostHP(curPlayer, skillTypeID, buffOwner, lostValue, tick)
     return
 
+##玩家收集成功(塔, 旗)
+# @param curPlayer 玩家实例
+# @param tick 时间戳
+# @return 无意义
+# @remarks
+def OnCollectOK(curPlayer, npcID, tick):
+    __DoCollectLostHP(curPlayer, npcID, tick)
+    return
 
 ##---副本总逻辑计时器---
 # @param tick:时间戳
@@ -183,33 +209,42 @@
             continue
         rmark = npcRefresh.GetRefreshMark()
         npcCntDict[rmark] = npcCntDict.get(rmark, 0) + npcRefresh.GetCount()
-        
+    isNeedSync = False #是否需要通知
     for markInfo, refreshInfo in refreshDict.items():
         npcID = refreshInfo[Def_NPCID]
         refreshCnt = refreshInfo[Def_FirstRefreshCnt] if isFirst else refreshInfo[Def_RefreshCnt]
         gameWorld.SetGameWorldDict(Map_Dogzfb_LastRefreshTime % npcID, curTime)
         maxCnt = refreshInfo[Def_MaxCnt]
         markList = [markInfo] if isinstance(markInfo, int) else list(markInfo)
-        random.shuffle(markList)
+        curTotalCnt = 0
         for rMark in markList:
-            if refreshCnt <=0:
-                break
-            curCnt = npcCntDict.get(rMark, 0)
-            if curCnt >= maxCnt:
-                continue
-            needRefreshCnt = min(refreshCnt, maxCnt - curCnt)
-            refreshCnt -= needRefreshCnt
-            NPCCustomRefresh.SetNPCRefresh(rMark, [(npcID, needRefreshCnt)], needRefreshCnt + curCnt, needRefreshCnt)
+            curTotalCnt += npcCntDict.get(rMark, 0)
+        refreshCnt = min(refreshCnt, refreshInfo[Def_TotalLimit] - curTotalCnt)
+        if refreshCnt > 0:
+            random.shuffle(markList)
+            for rMark in markList:
+                if refreshCnt <=0:
+                    break
+                curCnt = npcCntDict.get(rMark, 0)
+                if curCnt >= maxCnt:
+                    continue
+                needRefreshCnt = min(refreshCnt, maxCnt - curCnt)
+                refreshCnt -= needRefreshCnt
+                NPCCustomRefresh.SetNPCRefresh(rMark, [(npcID, needRefreshCnt)], needRefreshCnt + curCnt, needRefreshCnt)
         
         #计算下次多久刷新
         __UpdateBossTime(npcID, refreshInfo[Def_TimeFormula])
-        
+        if npcID in IpyGameDataPY.GetFuncEvalCfg('DogzFBRefreshCfg', 3):
+            isNeedSync = True
     #通知时间
-    SyncNPCRefreshTime()
+    if isNeedSync:
+        SyncNPCRefreshTime()
     
     return
 
 def OnOnlineCntChange(key, tick):
+    if GameWorld.GetMap().GetMapID() != ChConfig.Def_FBMapID_Dogz:
+        return
     bossid = IpyGameDataPY.GetFuncCfg('DogzFBRefreshCfg', 2)
     if str(bossid) not in key:
         return
@@ -238,14 +273,15 @@
     nextNeedTime = gameWorldMgr.GetGameWorldDictByKey(Map_Dogzfb_NextNeedTime % npcID)
     return max(0, nextNeedTime - curTime + lastRefreshTime)
 
-def SyncNPCRefreshTime(playerid=0):
-    curTime = int(time.time())
+def SyncNPCRefreshTime():
     syncNPCIDList = IpyGameDataPY.GetFuncEvalCfg('DogzFBRefreshCfg', 3)
     syncDict = {}
     for npcID in syncNPCIDList:
-        refreshTime = GetDogzNPCRefreshTime(curTime, npcID)
-        syncDict[npcID] = refreshTime
-    msgStr = str([playerid, syncDict])
+        gameWorldMgr = GameWorld.GetGameWorld()
+        lastRefreshTime = gameWorldMgr.GetGameWorldDictByKey(Map_Dogzfb_LastRefreshTime % npcID)
+        nextNeedTime = gameWorldMgr.GetGameWorldDictByKey(Map_Dogzfb_NextNeedTime % npcID)
+        syncDict[npcID] = [lastRefreshTime, nextNeedTime]
+    msgStr = str(syncDict)
     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'DogzNPCTime', msgStr, len(msgStr))
     return
 

--
Gitblit v1.8.0