From a9a7475c8b637b04843a5553a182a8fac9416bbb Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 16 一月 2019 11:50:09 +0800
Subject: [PATCH] 5722 【后端】【1.5】跨服BOSS开发(PK击杀全服广播、仙盟广播支援支持)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py |   85 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 84 insertions(+), 1 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
index 5a8c626..a86f294 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
@@ -17,7 +17,6 @@
 import ShareDefine
 import ReadChConfig
 import GameLogic_SealDemon
-import CrossRealmPlayer
 import PlayerControl
 import IPY_GameWorld
 import IpyGameDataPY
@@ -26,6 +25,7 @@
 import FBLogic
 
 import random
+import time
 #---------------------------------------------------------------------
 
 ## 所有npc刷新
@@ -900,3 +900,86 @@
 
 ################################################################################
 
+def ProcessMapRandomRefreshNPC(gameWorld, tick):
+    ''' 地图自定义随机刷怪,支持多点随机刷多种怪,标试点不可重复,支持跨服地图
+            注意:同个虚拟线路中,标试点不可重复!标试点不可重复!标试点不可重复!
+    '''
+    mapID = gameWorld.GetMapID()
+    # {mapID:{编号:[[多个NPCID], [多个标试点], 单个点最大数量, 所有点总数量, 刷怪间隔秒], ...}, ...}
+    randRefreshNPCDict = IpyGameDataPY.GetFuncEvalCfg("RandomRefreshNPC", 1, {})
+    if mapID not in randRefreshNPCDict:
+        return
+    mapRandRefreshNPCDict = randRefreshNPCDict[mapID]
+    
+    #copyMapID = gameWorld.GetCopyMapID()
+    
+    gameFB = GameWorld.GetGameFB()
+    lastCheckTick = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_RandomRefreshNPCTick)
+    if lastCheckTick and tick - lastCheckTick < 1000:
+        return
+    gameFB.SetGameFBDict(ChConfig.Def_RMark_RandomRefreshNPCTick, tick)
+    
+    curTime = int(time.time())
+    refreshNumList = []
+    for num, refreshInfo in mapRandRefreshNPCDict.items():
+        refreshCD = refreshInfo[-1]
+        numLastTime = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_RandomRefreshNPCNumTime % num)
+        if numLastTime and curTime - numLastTime < refreshCD:
+            continue
+        gameFB.SetGameFBDict(ChConfig.Def_RMark_RandomRefreshNPCNumTime % num, curTime)
+        refreshNumList.append(num)
+        
+    if not refreshNumList:
+        #GameWorld.DebugLog("没有需要刷怪的", copyMapID)
+        return
+    npcCountDict = {}  # 标识点对应NPC数量
+    rMarkNPCRefreshDict = {} # 标试点对应标试点实例 {标试点:IPY_CustomNPCRefresh, ...}
+    gameNPC = GameWorld.GetNPCManager()
+    for i in xrange(gameNPC.GetCustomNPCRefreshCount()):
+        npcRefresh = gameNPC.GetCustomNPCRefreshAt(i)
+        npcCount = npcRefresh.GetCount()
+        #if not npcCount: # 因为要记录刷怪点实例,所以0的不屏蔽
+        #    continue
+        rMark = npcRefresh.GetRefreshMark()
+        npcCountDict[rMark] = npcCountDict.get(rMark, 0) + npcCount
+        rMarkNPCRefreshDict[rMark] = npcRefresh
+        
+    #GameWorld.DebugLog("npcCountDict=%s" % npcCountDict, copyMapID)
+    for num in refreshNumList:
+        npcIDList, markList, maxCount, totalMaxCount = mapRandRefreshNPCDict[num][:-1]
+        
+        curTotalCount = 0
+        for rMark in markList:
+            curTotalCount += npcCountDict.get(rMark, 0)
+            
+        refreshCount = totalMaxCount - curTotalCount
+        
+        #GameWorld.DebugLog("    num=%s,markList=%s,curTotalCount=%s,totalMaxCount=%s,refreshCount=%s" 
+        #                   % (num, markList, curTotalCount, totalMaxCount, refreshCount), copyMapID)
+        if refreshCount <= 0:
+            continue
+        
+        random.shuffle(markList) # 随机打乱顺序
+        #GameWorld.DebugLog("    markList=%s" % markList, copyMapID)
+        for rMark in markList:
+            if rMark not in rMarkNPCRefreshDict:
+                #GameWorld.DebugLog("        标试点不存在: rMark=%s" % rMark, copyMapID)
+                continue
+            if refreshCount <= 0:
+                #GameWorld.DebugLog("        不需要刷怪了: rMark=%s" % rMark, copyMapID)
+                break
+            curCount = npcCountDict.get(rMark, 0)
+            if curCount >= maxCount:
+                #GameWorld.DebugLog("        该点已经达到单点最大数: rMark=%s" % rMark, copyMapID)
+                continue
+            needRefreshCount = min(refreshCount, maxCount - curCount)
+            refreshCount -= needRefreshCount
+            npcID = npcIDList[0] if len(npcIDList) == 1 else random.choice(npcIDList)
+            
+            #GameWorld.DebugLog("        刷怪: rMark=%s,needRefreshCount=%s,还需=%s" % (rMark, needRefreshCount, refreshCount), copyMapID)
+            npcRefresh = rMarkNPCRefreshDict[rMark]
+            npcRefresh.Refresh(npcID, ChConfig.Def_NormalNPCAngryCount, needRefreshCount, False)
+            __InitNewBornNPC(npcRefresh , tick)
+            
+    return
+

--
Gitblit v1.8.0