From f3f55bc0b986102ca0bd70063cafa11c04756fe1 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 16 四月 2019 10:14:55 +0800 Subject: [PATCH] 6459 【后端】【2.0】缥缈仙域开发单(地图刷怪逻辑修改,草园刷怪支持配置,支持开关线路保存刷怪信息) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py | 112 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 89 insertions(+), 23 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 d4c95eb..d1cbeb0 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py @@ -855,12 +855,13 @@ ''' 地图自定义随机刷怪,支持多点随机刷多种怪,标试点不可重复,支持跨服地图 注意:同个虚拟线路中,标试点不可重复!标试点不可重复!标试点不可重复! ''' - mapID = gameWorld.GetMapID() - # {mapID:{编号:[[多个NPCID], [多个标试点], 单个点最大数量, 所有点总数量, 刷怪间隔秒, 每整X小时], ...}, ...} - 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() @@ -872,21 +873,26 @@ serverTime = GameWorld.GetCurrentTime() curHour, curMinute = serverTime.hour, serverTime.minute - refreshNumList = [] - for num, refreshInfo in mapRandRefreshNPCDict.items(): - refreshCD = refreshInfo[4] + minuteTotal = curHour * 60 + curMinute + needRefreshIpyDataList = [] + for ipyData in refreshIpyDataList: + num = ipyData.GetRefreshNum() numLastTick = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_RandomRefreshNPCNumTime % num) - perHours = refreshInfo[5] - if numLastTick and perHours: - if curHour % perHours != 0 or curMinute != 0: + if numLastTick: + perMinutes = ipyData.GetRefreshPerMinutes() + if perMinutes: + if minuteTotal % perMinutes != 0: + continue + refreshCD = 60 # 1分钟内不重复刷新 + else: + refreshCD = ipyData.GetRefreshSeconds() + + if tick - numLastTick < refreshCD * 1000: continue - refreshCD = 65 # 1分钟内不重复刷新 - if numLastTick and tick - numLastTick < refreshCD * 1000: - continue gameFB.SetGameFBDict(ChConfig.Def_RMark_RandomRefreshNPCNumTime % num, tick) - refreshNumList.append(num) + needRefreshIpyDataList.append(ipyData) - if not refreshNumList: + if not needRefreshIpyDataList: #GameWorld.DebugLog("没有需要刷怪的", copyMapID) return npcCountDict = {} # 标识点对应NPC数量 @@ -901,9 +907,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][:4] + #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: @@ -911,13 +920,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) @@ -940,3 +952,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