From ee0976feabc604ac91bdc86fc368941cf85d97b7 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 12 二月 2019 11:39:51 +0800 Subject: [PATCH] Merge branch 'master' of http://192.168.0.87:10010/r/SnxxServerCode --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py | 102 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 97 insertions(+), 5 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..2d0836a 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,7 @@ import ShareDefine import ReadChConfig import GameLogic_SealDemon -import CrossRealmPlayer +import GameLogic_ZhuXianBoss import PlayerControl import IPY_GameWorld import IpyGameDataPY @@ -26,6 +26,7 @@ import FBLogic import random +import time #--------------------------------------------------------------------- ## 所有npc刷新 @@ -401,6 +402,9 @@ if mapID == ChConfig.Def_FBMapID_SealDemon: bossID = GameLogic_SealDemon.CurFBLineBOSSID() stoneNPCID = 0 + elif mapID == ChConfig.Def_FBMapID_ZhuXianBoss: + bossID = GameLogic_ZhuXianBoss.CurFBLineBOSSID() + stoneNPCID = 0 else: ipyData = IpyGameDataPY.GetIpyGameDataByCondition('BOSSInfo', {'RefreshMark':refreshMark, 'MapID':mapID}, isLogNone=False) if not ipyData: @@ -412,7 +416,6 @@ isNeedShunt = ipyData.GetIsNeedShunt() if not bossID and not stoneNPCID: return - gameFB = GameWorld.GetGameFB() gameWorldMgr = GameWorld.GetGameWorld() isActivityBoss = False # 是否活动boss @@ -463,7 +466,7 @@ NPCCommon.SetDeadEx(curNPC) # 非复活线 且 不需要分流的地图 且 不是封魔坛 不允许复活 - if lineID != rebornLineID and not isNeedShunt and mapID != ChConfig.Def_FBMapID_SealDemon: + if lineID != rebornLineID and not isNeedShunt and mapID not in [ChConfig.Def_FBMapID_SealDemon, ChConfig.Def_FBMapID_ZhuXianBoss]: return if isActivityBoss and activityBossRebornCount > 0: @@ -553,9 +556,9 @@ if not bossID and not stoneNPCID: return - if mapID not in ChConfig.Def_CrossZoneTableName: + if mapID not in ChConfig.Def_CrossZoneMapTableName: return - tableName = ChConfig.Def_CrossZoneTableName[mapID] + tableName = ChConfig.Def_CrossZoneMapTableName[mapID] realMapID = GameWorld.GetGameWorld().GetRealMapID() copyMapID = GameWorld.GetGameWorld().GetCopyMapID() zoneIpyData = IpyGameDataPY.GetIpyGameDataNotLog(tableName, realMapID, mapID, copyMapID) @@ -900,3 +903,92 @@ ################################################################################ +def ProcessMapRandomRefreshNPC(gameWorld, tick): + ''' 地图自定义随机刷怪,支持多点随机刷多种怪,标试点不可重复,支持跨服地图 + 注意:同个虚拟线路中,标试点不可重复!标试点不可重复!标试点不可重复! + ''' + mapID = gameWorld.GetMapID() + # {mapID:{编号:[[多个NPCID], [多个标试点], 单个点最大数量, 所有点总数量, 刷怪间隔秒, 每整X小时], ...}, ...} + 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) + + serverTime = GameWorld.GetCurrentTime() + curHour, curMinute = serverTime.hour, serverTime.minute + refreshNumList = [] + for num, refreshInfo in mapRandRefreshNPCDict.items(): + refreshCD = refreshInfo[4] + numLastTick = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_RandomRefreshNPCNumTime % num) + perHours = refreshInfo[5] + if numLastTick and perHours: + if curHour % perHours != 0 or curMinute != 0: + continue + refreshCD = 65 # 1分钟内不重复刷新 + if numLastTick and tick - numLastTick < refreshCD * 1000: + continue + gameFB.SetGameFBDict(ChConfig.Def_RMark_RandomRefreshNPCNumTime % num, tick) + 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][:4] + + 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