From 69a763fb7cdb30bd5f7a860e4fd4a9270adb23b9 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期四, 09 五月 2019 20:41:56 +0800
Subject: [PATCH] 6628 查看玩家 技能总等级信息

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py |  230 +++++++++++++++++++++++++++++++-------------------------
 1 files changed, 127 insertions(+), 103 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 6e0c400..b0f4183 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
@@ -18,6 +18,7 @@
 import ReadChConfig
 import GameLogic_SealDemon
 import GameLogic_ZhuXianBoss
+import GameLogic_CrossDemonKing
 import PlayerControl
 import IPY_GameWorld
 import IpyGameDataPY
@@ -92,72 +93,6 @@
         
     return
 ##------------------------------------------------------------------------------
-
-## 合服活动BOSS(勇者大陆)
-#  @param npcRefresh 刷新的npc对象
-#  @param tick 当前时间
-#  @return None
-def NPCRefresh_63(npcRefresh, tick): return __RefreshMixBoss(npcRefresh, tick)
-def NPCRefresh_64(npcRefresh, tick): return __RefreshMixBoss(npcRefresh, tick)
-def NPCRefresh_65(npcRefresh, tick): return __RefreshMixBoss(npcRefresh, tick)
-
-## 合服活动BOSS(勇者大陆)
-#  @param npcRefresh 刷新的npc对象
-#  @param tick 当前时间
-#  @return None
-def __RefreshMixBoss(npcRefresh, tick):
-    gameWorld = GameWorld.GetGameWorld()
-    isMixServer = gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_IsMixServer)
-    mixDay = gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_MixServerDay)
-    refreshMark = npcRefresh.GetRefreshMark()
-    
-    # 配置
-    mixBossInfo = ReadChConfig.GetEvalChConfig("MixBossInfo")
-    curBossInfo = mixBossInfo.get(refreshMark)
-    if not curBossInfo:
-        #GameWorld.DebugLog("__RefreshMixBoss() hasn't configuration refreshMark(%s)"%refreshMark)
-        return
-    npcId, mixTime, refreshTimeList = curBossInfo
-    
-    # 合服期间
-    if not isMixServer or mixDay < mixTime[0] or mixDay > mixTime[1]:
-        #GameWorld.DebugLog("__RefreshMixBoss() no mix server")
-        return
-    
-    # 一线刷新
-    lineId = GameWorld.GetGameWorld().GetLineID()
-    if lineId != 0:
-        #GameWorld.DebugLog("__RefreshMixBoss() not in 1 line(%s), now"%lineId)
-        return
-    
-    # 有怪
-    if npcRefresh.GetCount() > 0:
-        #GameWorld.DebugLog("__RefreshMixBoss() have mix server boss(%s), now"%refreshMark)
-        return
-    
-    # 刷新时间匹配
-    curTime = GameWorld.GetCurrentTime()
-    if (curTime.hour, curTime.minute) not in refreshTimeList:
-        #GameWorld.DebugLog("__RefreshMixBoss() npcId(%s) isn't refresh(%s) time(%s)"
-        #                   % (npcId, str((curTime.hour, curTime.minute)), refreshTimeList))
-        return
-    
-    # 刷新Tick 一分钟内不再刷新
-    refreshTickKey = ChConfig.Map_NPC_WorldBossLastReBornTick % npcId
-    lastRefreshTick = gameWorld.GetGameWorldDictByKey(refreshTickKey)
-    if tick - lastRefreshTick <= 60 * 1000:
-        #GameWorld.DebugLog("__RefreshMixBoss() not refresh inside minute, npcID(%s) tick(%s) lastTick(%s)"
-        #                   % (npcId, tick, lastRefreshTick))
-        return
-    gameWorld.SetGameWorldDict(refreshTickKey, tick)
-    
-    # 刷新NPC
-    npcRefresh.Refresh(npcId, ChConfig.Def_SuperBossAngryCount, 1, False)
-    # 初始化NPC
-    __InitNewBornNPC(npcRefresh, tick)
-    
-    GameWorld.DebugLog("__RefreshMixBoss() refresh mix server boss npcId(%s) success!!!" % (npcId))
-    return
 
 ## 地图M个点随机刷N只怪
 #  @param npcRefresh 刷新实例
@@ -373,6 +308,8 @@
         
     gameWorld = IPY_GameWorld.IPY_GameWorld(activityLineIndex)
     gameFB = gameWorld.GetGameFBByFbIndex(activityLineIndex)
+    if not gameFB:
+        return
     
     gameNPC = GameWorld.GetNPCManager() # NPC标识点的无所谓,哪条线都可以,因为都一样
     for i in xrange(gameNPC.GetCustomNPCRefreshCount()):
@@ -401,6 +338,9 @@
     isNeedShunt = 0
     if mapID == ChConfig.Def_FBMapID_SealDemon:
         bossID = GameLogic_SealDemon.CurFBLineBOSSID()
+        stoneNPCID = 0
+    elif mapID == ChConfig.Def_FBMapID_DemonKing:
+        bossID = GameLogic_CrossDemonKing.GetCurFBLineBOSSID()
         stoneNPCID = 0
     elif mapID == ChConfig.Def_FBMapID_ZhuXianBoss:
         bossID = GameLogic_ZhuXianBoss.CurFBLineBOSSID()
@@ -547,24 +487,34 @@
     
     refreshMark = npcRefresh.GetRefreshMark()
     lineID = GameWorld.GetGameWorld().GetLineID()
-    bossIpyData = IpyGameDataPY.GetIpyGameDataByCondition('BOSSInfo', {'RefreshMark':refreshMark, 'MapID':mapID}, isLogNone=False)
-    if not bossIpyData:
-        return
-    
-    stoneNPCID = bossIpyData.GetStoneNPCID()
-    bossID = bossIpyData.GetNPCID()
-    if not bossID and not stoneNPCID:
-        return
-    
-    if mapID not in ChConfig.Def_CrossZoneTableName:
-        return
-    tableName = ChConfig.Def_CrossZoneTableName[mapID]
     realMapID = GameWorld.GetGameWorld().GetRealMapID()
     copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
-    zoneIpyData = IpyGameDataPY.GetIpyGameDataNotLog(tableName, realMapID, mapID, copyMapID)
-    if not zoneIpyData:
+    
+    if mapID == ChConfig.Def_FBMapID_CrossDemonKing:
+        bossID = GameLogic_CrossDemonKing.GetCurFBLineBOSSID()
+        stoneNPCID = 0
+        zoneID = GameLogic_CrossDemonKing.GetCurFBLineZoneID()
+        
+    else:
+        bossIpyData = IpyGameDataPY.GetIpyGameDataByCondition('BOSSInfo', {'RefreshMark':refreshMark, 'MapID':mapID}, isLogNone=False)
+        if not bossIpyData:
+            return
+        
+        stoneNPCID = bossIpyData.GetStoneNPCID()
+        bossID = bossIpyData.GetNPCID()
+
+        if mapID not in ChConfig.Def_CrossZoneMapTableName:
+            return
+        tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
+        zoneIpyData = IpyGameDataPY.GetIpyGameDataNotLog(tableName, realMapID, mapID, copyMapID)
+        if not zoneIpyData:
+            return
+        zoneID = zoneIpyData.GetZoneID()
+        
+    if not zoneID:
         return
-    zoneID = zoneIpyData.GetZoneID()
+    if not bossID and not stoneNPCID:
+        return
     
     gameFB = GameWorld.GetGameFB()
     bosskey = ShareDefine.Def_Notify_WorldKey_GameWorldBossRebornCross % (zoneID, bossID)
@@ -907,12 +857,13 @@
     ''' 地图自定义随机刷怪,支持多点随机刷多种怪,标试点不可重复,支持跨服地图
             注意:同个虚拟线路中,标试点不可重复!标试点不可重复!标试点不可重复!
     '''
-    mapID = gameWorld.GetMapID()
-    # {mapID:{编号:[[多个NPCID], [多个标试点], 单个点最大数量, 所有点总数量, 刷怪间隔秒], ...}, ...}
-    randRefreshNPCDict = IpyGameDataPY.GetFuncEvalCfg("RandomRefreshNPC", 1, {})
-    if mapID not in randRefreshNPCDict:
+    if gameWorld.GetOpenState() != IPY_GameWorld.fbosOpen:
+        #已经关闭了
         return
-    mapRandRefreshNPCDict = randRefreshNPCDict[mapID]
+    mapID = gameWorld.GetMapID()
+    refreshIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("MapRefreshNPC", mapID)
+    if not refreshIpyDataList:
+        return
     
     #copyMapID = gameWorld.GetCopyMapID()
     
@@ -922,17 +873,30 @@
         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)
+    serverTime = GameWorld.GetCurrentTime()
+    curHour, curMinute = serverTime.hour, serverTime.minute
+    minuteTotal = curHour * 60 + curMinute
+    needRefreshIpyDataList = []
+    for ipyData in refreshIpyDataList:
+        num = ipyData.GetRefreshNum()
+        numLastTick = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_RandomRefreshNPCNumTime % num)
+        if numLastTick:
+            perMinutes = ipyData.GetRefreshPerMinutes()
+            if perMinutes:
+                if minuteTotal % perMinutes != 0:
+                    continue
+                refreshCD = 60 # 1分钟内不重复刷新
+            else:
+                refreshCD = ipyData.GetRefreshSeconds()
+                
+            if not refreshCD:
+                continue
+            if tick - numLastTick < refreshCD * 1000:
+                continue
+        gameFB.SetGameFBDict(ChConfig.Def_RMark_RandomRefreshNPCNumTime % num, tick)
+        needRefreshIpyDataList.append(ipyData)
         
-    if not refreshNumList:
+    if not needRefreshIpyDataList:
         #GameWorld.DebugLog("没有需要刷怪的", copyMapID)
         return
     npcCountDict = {}  # 标识点对应NPC数量
@@ -947,9 +911,12 @@
         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]
+    #GameWorld.DebugLog("标试点怪物数: minuteTotal=%s,npcCountDict=%s" % (minuteTotal, npcCountDict), copyMapID)
+    for ipyData in needRefreshIpyDataList:
+        npcIDList = ipyData.GetNPCIDList()
+        markList = ipyData.GetRefreshMarkList()
+        maxCount = ipyData.GetPointMaxCount()
+        totalMaxCount = ipyData.GetTotalMaxCount()
         
         curTotalCount = 0
         for rMark in markList:
@@ -957,13 +924,16 @@
             
         refreshCount = totalMaxCount - curTotalCount
         
-        #GameWorld.DebugLog("    num=%s,markList=%s,curTotalCount=%s,totalMaxCount=%s,refreshCount=%s" 
-        #                   % (num, markList, curTotalCount, totalMaxCount, refreshCount), copyMapID)
+        #GameWorld.DebugLog("    npcIDList=%s,markList=%s,curTotalCount=%s,totalMaxCount=%s,refreshCount=%s" 
+        #                   % (npcIDList, markList, curTotalCount, totalMaxCount, refreshCount), copyMapID)
         if refreshCount <= 0:
             continue
         
-        random.shuffle(markList) # 随机打乱顺序
-        #GameWorld.DebugLog("    markList=%s" % markList, copyMapID)
+        isNeedRandom = len(markList) != totalMaxCount
+        if isNeedRandom:
+            markList = list(markList)
+            random.shuffle(markList) # 随机打乱顺序,如果需要随机的话就用多个不同的标试点
+        #GameWorld.DebugLog("    markList=%s" % str(markList), copyMapID)
         for rMark in markList:
             if rMark not in rMarkNPCRefreshDict:
                 #GameWorld.DebugLog("        标试点不存在: rMark=%s" % rMark, copyMapID)
@@ -986,3 +956,57 @@
             
     return
 
+def GetCopyMapRandomRefreshNPCInfo():
+    ## 获取当前虚拟线路随机刷怪点NPC信息
+    
+    gameWorld = GameWorld.GetGameWorld()
+    mapID = gameWorld.GetMapID()
+    refreshIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("MapRefreshNPC", mapID)
+    if not refreshIpyDataList:
+        return
+    
+    lastRefreshTickDict = {}
+    gameFB = GameWorld.GetGameFB()
+    for ipyData in refreshIpyDataList:
+        num = ipyData.GetRefreshNum()
+        lastRefreshTickDict[num] = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_RandomRefreshNPCNumTime % num)
+        
+    markNPCDict = {}  # 标识点对应NPC数量
+    gameNPC = GameWorld.GetNPCManager()
+    for i in xrange(gameNPC.GetCustomNPCRefreshCount()):
+        npcRefresh = gameNPC.GetCustomNPCRefreshAt(i)
+        npcCount = npcRefresh.GetCount()
+        if not npcCount:
+            continue
+        
+        rMark = npcRefresh.GetRefreshMark()
+        npcIDCountDict = {}
+        for j in xrange(npcCount):
+            curNPC = npcRefresh.GetAt(j)
+            npcID = curNPC.GetNPCID()
+            npcIDCountDict[npcID] = npcIDCountDict.get(npcID, 0) + 1
+        markNPCDict[rMark] = npcIDCountDict
+    return lastRefreshTickDict, markNPCDict
+
+def OnFBOpenSetRandomRefreshNPCInfo(refreshNPCInfo, tick):
+    ## 副本虚拟线路启动时,根据保存的标试点刷怪信息设置刷怪
+    lastRefreshTickDict, markNPCDict = refreshNPCInfo
+        
+    gameFB = GameWorld.GetGameFB()
+    gameFB.SetGameFBDict(ChConfig.Def_RMark_RandomRefreshNPCTick, tick)
+    for num, setTick in lastRefreshTickDict.items():
+        gameFB.SetGameFBDict(ChConfig.Def_RMark_RandomRefreshNPCNumTime % num, setTick)
+        
+    gameNPC = GameWorld.GetNPCManager()
+    for i in xrange(gameNPC.GetCustomNPCRefreshCount()):
+        npcRefresh = gameNPC.GetCustomNPCRefreshAt(i)
+        rMark = npcRefresh.GetRefreshMark()
+        if rMark not in markNPCDict:
+            continue
+        npcIDCountDict = markNPCDict[rMark]
+        for npcID, count in npcIDCountDict.items():
+            GameWorld.DebugLog("    副本启动刷怪: rMark=%s,npcID=%s,count=%s" % (rMark, npcID, count))
+            npcRefresh.Refresh(npcID, ChConfig.Def_NormalNPCAngryCount, count, False)
+            __InitNewBornNPC(npcRefresh , tick)
+            
+    return

--
Gitblit v1.8.0