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