xdh
2019-03-20 2553f010270f9dff6f1ee1403caab4ff826e00c2
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刷新
@@ -91,72 +92,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 刷新实例
@@ -401,6 +336,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 +350,6 @@
        isNeedShunt = ipyData.GetIsNeedShunt()
    if not bossID and not stoneNPCID:
        return
    gameFB = GameWorld.GetGameFB()
    gameWorldMgr = GameWorld.GetGameWorld()
    isActivityBoss = False # 是否活动boss
@@ -463,7 +400,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 +490,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 +837,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