#!/usr/bin/python # -*- coding: GBK -*- # ##@package E:/GameSVN/U3DGame/ProjectSServer/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py # @todo: # # @author: Alee # @date 2017-10-24 ÏÂÎç08:32:32 # @version 1.0 # # @note: # #--------------------------------------------------------------------- #--------------------------------------------------------------------- import ChConfig import NPCCommon import ShareDefine import ReadChConfig import GameLogic_SealDemon import GameLogic_ZhuXianBoss import GameLogic_CrossDemonKing import PlayerControl import IPY_GameWorld import IpyGameDataPY import PyGameData import GameWorld import FBCommon import FBLogic import random import time #--------------------------------------------------------------------- ## ËùÓÐnpcˢР# @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ProcessAllNPCRefresh(tick): if GameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 0 and \ GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull and \ GameWorld.GetMap().GetMapID() not in ChConfig.Def_NoPlayerNeedProcessRefreshPointMap: #¸±±¾ÎÞÍæ¼Ò²»´¦Àí return gameWorld = GameWorld.GetGameWorld() if gameWorld.GetOpenState() != IPY_GameWorld.fbosOpen: #GameWorld.Log("¸±±¾¹Ø±Õ²»´¦Àí = %s State = %s" % (gameWorld.GetLineID(), gameWorld.GetOpenState())) return gameNPC = GameWorld.GetNPCManager() for i in range(0, gameNPC.GetCustomNPCRefreshCount()): __ProcessNPCRefresh(i, gameNPC.GetCustomNPCRefreshAt(i), tick) return ## Ö´ÐÐnpcˢР# @param npcRefresh npcʵÀý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __ProcessNPCRefresh(pointIndex, npcRefresh, tick): funcName = "NPCRefresh_%d" % npcRefresh.GetRefreshMark() if globals().has_key(funcName) and GameWorld.GetMap().GetMapID() != ChConfig.Def_FBMapID_ClearDevil: return globals()[funcName](npcRefresh, tick) else: #GameWorld.DebugLog("__NPCCommonRefresh mark = %s" % npcRefresh.GetRefreshMark()) __NPCCommonRefresh(pointIndex, npcRefresh, tick) #else: # GameWorld.Log("Error : ProcessNPCRefresh NPCRefreshID = %s" % funcName) return #-------------------------¹«Óú¯ÊýÇø---------------------------------- ## ³õʼ»¯ÐÂÉú³öÀ´µÄNPC # @param npcRefresh Ë¢ÐÂʵÀý # @param tick µ±Ç°ÊµÀý # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __InitNewBornNPC(npcRefresh, tick, value=0): refreshMark = npcRefresh.GetRefreshMark() #³õʼ»¯NPC for i in range(npcRefresh.GetNewBornNPCCount()): curNPC = npcRefresh.GetNewBornNPCAt(i) #³õʼ»¯NPC»ù´¡ÐÅÏ¢ NPCCommon.InitNPC(curNPC) curNPC.SetDict(ChConfig.Def_NPC_Dict_FromRefreshMark, refreshMark) curNPC.SetDict(ChConfig.Def_NPC_Dict_FromRefreshValue, value) #ÉèÖÃNPCÖØÉú NPCCommon.NPCControl(curNPC).DoNPCRebornCommLogic(tick) return ##------------------------------------------------------------------------------ ## µØÍ¼M¸öµãËæ»úË¢NÖ»¹Ö # @param npcRefresh Ë¢ÐÂʵÀý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks Õâ±ßÖ»×öË¢¹Ö£¬¾ßÌåË¢ÔÚÄĸö±êʶµã£¬Ë¢Ê²Ã´¹Ö£¬Ë¢¼¸Ö»Óɹ¦ÄÜ×Ô¼º¾ö¶¨ def NPCRefresh_82(npcRefresh, tick): return __RandomMapNPC(npcRefresh, tick) def NPCRefresh_83(npcRefresh, tick): return __RandomMapNPC(npcRefresh, tick) def __RandomMapNPC(npcRefresh, tick): refreshMark = npcRefresh.GetRefreshMark() gameFB = GameWorld.GetGameFB() npcIDKey = ChConfig.Map_NPC_RandomMapNPCID % refreshMark needCntKey = ChConfig.Map_NPC_RandomMapNPCNeedCnt % refreshMark perMaxCntKey = ChConfig.Map_NPC_RandomMapNPCPerMaxCnt % refreshMark npcID = gameFB.GetGameFBDictByKey(npcIDKey) needCnt = gameFB.GetGameFBDictByKey(needCntKey) maxCnt = gameFB.GetGameFBDictByKey(perMaxCntKey) # ²»ÐèÒª²¹³ä£¬²»Ë¢¹Ö if needCnt <= 0: return curCnt = npcRefresh.GetCount() curCanCnt = maxCnt - curCnt # ±¾µã×î´óË¢¹ÖÊýÒÑÂú£¬ÎÞ·¨ÔÙË¢£¡ if curCanCnt <= 0: GameWorld.DebugLog("µØÍ¼Ëæ»úË¢¹Ö ±¾µã×î´óË¢¹ÖÊýÒÑÂú£¬ÎÞ·¨ÔÙË¢! refreshMark=%s,maxCnt=%s" % (refreshMark, maxCnt)) return # ±¾µãÊÇ·ñË¢¹Ö if random.randint(0, 1) == 0: GameWorld.DebugLog("µØÍ¼Ëæ»úË¢¹Ö ¸ÃË¢¹ÖµãûÓÐÃüÖУ¬²»Ë¢¹Ö! refreshMark=%s" % refreshMark) return # Ë¢¹Ö npcRefresh.Refresh(npcID, ChConfig.Def_SuperBossAngryCount, 1, False) # ³õʼ»¯NPC __InitNewBornNPC(npcRefresh, tick) # ¸üл¹ÐèÊý updNeedCnt = max(0, needCnt - 1) gameFB.SetGameFBDict(needCntKey, updNeedCnt) GameWorld.Log("µØÍ¼Ëæ»úË¢¹Ö mark=%s,npcID=%s,updNeedCnt=%s" % (refreshMark, npcID, updNeedCnt)) return ## Ëþ·À/¹¥³ÇÀàÐ͸±±¾Ë¢¹Ö, Ŀǰ֧³ÖͬÕŵØÍ¼4¸ö³ö¹ÖµãË¢¹Ö, Èç¹û¼Ó·Ïß, ¶à¼ÓÒ»¸ö²»Öظ´Ë¢¹Ö±êʶµã¼´¿É def NPCRefresh_84(npcRefresh, tick): return __RefreshTDFBNPC(npcRefresh, tick) def NPCRefresh_85(npcRefresh, tick): return __RefreshTDFBNPC(npcRefresh, tick) def NPCRefresh_86(npcRefresh, tick): return __RefreshTDFBNPC(npcRefresh, tick) def NPCRefresh_87(npcRefresh, tick): return __RefreshTDFBNPC(npcRefresh, tick) ## Ëþ·ÀÀàÐ͸±±¾Ë¢¹Ö # @remarks ±¾Âß¼­3Ãë²Å»áÖ´ÐÐÒ»´Î£¬¹ÖÎïÊýͳ¼Æ¼°½øÈëÏÂÒ»´ó²¨½¨Òé·Å¸÷×Ô¸±±¾Âß¼­×ÔÐÐÅжϣ¬·ÀÖ¹ÑÓ³Ù£¬Ó°ÏìÌåÑé def __RefreshTDFBNPC(npcRefresh, tick): rMark = npcRefresh.GetRefreshMark() gameFB = GameWorld.GetGameFB() # ¿ªÊ¼Ë¢¹Ötick, 0´ú±í¹Ø±ÕË¢¹Ö startTickKey = ChConfig.Map_TDNPC_RefreshStartTick % rMark startTick = gameFB.GetGameFBDictByKey(startTickKey) if startTick <= 0: return bigWheelNum = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_RefreshBigWheelNum % rMark) smallWheelNum = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_RefreshSmallWheelNum % rMark) curWheelIsOverKey = ChConfig.Map_TDNPC_CurWheelIsOver % rMark curWheelIsOver = gameFB.GetGameFBDictByKey(curWheelIsOverKey) # µ±Ç°²¨ÒÑË¢Íê, ÔÝÍ£´¦Àí, µÈ´ýÏÂÒ»²¨Ë¢¹Ö if curWheelIsOver: #GameWorld.DebugLog("µ±Ç°²¨ÒÑË¢Íê, ÔÝÍ£´¦Àí, µÈ´ýÏÂÒ»²¨Ë¢¹Ö! %s - %s" % (bigWheelNum, smallWheelNum)) return fileNum = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_RefreshFileNum % rMark) signKey = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_RefreshSignKey % rMark) fileName = "TD_%s_NPCID" % fileNum refreshNPCDict = ReadChConfig.GetEvalChConfig(fileName) # ÅäÖôíÎó, ¹Ø±ÕË¢¹Ö if signKey not in refreshNPCDict: gameFB.SetGameFBDict(startTickKey, 0) GameWorld.ErrLog("TDË¢¹Ö±ê¼Çkey²»´æÔÚ: signKey=%s not in fileName=%s, rMark=%s" % (signKey, fileName, rMark)) return totalNPCList = refreshNPCDict[signKey] totalWheel = len(totalNPCList) # ×Ü´ó²¨Êý # ÅäÖôíÎó, ¹Ø±ÕË¢¹Ö if bigWheelNum > totalWheel - 1: gameFB.SetGameFBDict(startTickKey, 0) GameWorld.ErrLog("TDË¢¹Ö²¨ÊýÅäÖò»´æÔÚ: fileName=%s,signKey=%s,bigWheelNum=%s" % (fileName, signKey, bigWheelNum)) return refreshCfgList = ReadChConfig.GetEvalChConfig("TD_%s_Cfg" % fileNum) if totalWheel != len(refreshCfgList): gameFB.SetGameFBDict(startTickKey, 0) GameWorld.ErrLog("TDË¢¹Ö×ܲ¨ÊýÓ벨ÊýÅäÖÃÐÅÏ¢ÌõÊý²»¶ÔÓ¦: fileName=%s,totalWheel=%s" % (fileName, totalWheel)) return bigWheelNPCList = totalNPCList[bigWheelNum] # ±¾´ó²¨ËùÓÐNPCÁбí wheelInfoList = refreshCfgList[bigWheelNum] curWheelStartTick = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_CurWheelStartTick % rMark) prepareTime = wheelInfoList[FBCommon.Def_TDCfg_PrepareTime] # ´ó²¨¿ªÊ¼Ç°×¼±¸Ê±¼ä if prepareTime > 0 and tick - curWheelStartTick < prepareTime: #GameWorld.DebugLog("¿ªÊ¼Ë¢¹Ö×¼±¸ÖÐ...curWheel=%s, (%s - %s)=%s < %s" # % (bigWheelNum, tick, curWheelStartTick, tick - curWheelStartTick, prepareTime)) return curCnt = npcRefresh.GetCount() # û¹Ö¾ÍÖ±½ÓË¢£¬ÓйÖÔòÐèÅжÏˢмä¸ô refreshTick = 0 if curCnt > 0 and smallWheelNum > 0: refreshTick += wheelInfoList[FBCommon.Def_TDCfg_SmallWheelSpace] # Èç¹ûÓÐË¢¹Öʱ¼ä¼ä¸ô if refreshTick > 0 and tick - npcRefresh.GetRefreshTick() < refreshTick: return curRefreshNpcIdList = bigWheelNPCList[smallWheelNum] GameWorld.DebugLog("TDË¢¹Ö£ºfileNum=%s,signKey=%s,rMark=%s,bWheelNum=%s,sWheelNum=%s,npcList=%s" % (fileNum, signKey, rMark, bigWheelNum, smallWheelNum, curRefreshNpcIdList)) # Ë¢³ö±¾´ÎËùÓÐNPC for refreshNPCInfo in curRefreshNpcIdList: curNpcId = refreshNPCInfo[0] refreshCnt = refreshNPCInfo[1] angryCnt = ChConfig.Def_SummonNPC_Angry_Count if len(refreshNPCInfo) < 3 else refreshNPCInfo[2] npcRefresh.Refresh(curNpcId, angryCnt, refreshCnt, False) #³õʼ»¯NPC __InitNewBornNPC(npcRefresh, tick, fileNum) isLastBigWheel = bigWheelNum >= totalWheel - 1 # ÊÇ·ñ×îºóÒ»´ó²¨ isLastSmallWheel = smallWheelNum >= len(bigWheelNPCList) - 1 # ÊÇ·ñ±¾´ó²¨×îºóһС²¨ # ËùÓйÖË¢ÐÂÍê±Ï£¬¹Ø±ÕË¢¹Ö if isLastBigWheel and isLastSmallWheel: gameFB.SetGameFBDict(startTickKey, 0) gameFB.SetGameFBDict(curWheelIsOverKey, 1) gameFB.SetGameFBDict(ChConfig.Map_TDNPC_AllWheelIsOver % rMark, 1) GameWorld.DebugLog(" ËùÓйÖË¢ÐÂÍê±Ï£¬¹Ø±ÕË¢¹Ö!rMark=%s" % rMark) FBLogic.OnTDAllWheelOver(tick) # ×îºóһС²¨ elif isLastSmallWheel: gameFB.SetGameFBDict(curWheelIsOverKey, 1) GameWorld.DebugLog(" ×îºóһС²¨¹ÖË¢ÐÂÍê±Ï(%s - %s)£¬ÔÝͣˢ¹Ö!rMark=%s" % (bigWheelNum, smallWheelNum, rMark)) FBLogic.OnTDCurWheelOver(rMark, tick) # С²¨Ë¢ÐÂÊý+1 else: gameFB.SetGameFBDict(ChConfig.Map_TDNPC_RefreshSmallWheelNum % rMark, smallWheelNum + 1) return ## ÊÀ½çbossË¢¹Ö90-100 # @param npcRefresh Ë¢ÐÂʵÀý # @param tick µ±Ç°Ê±¼ä # @return None def NPCRefresh_90(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_91(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_92(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_93(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_94(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_95(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_96(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_97(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_98(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_99(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_100(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_180(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_181(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_182(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_183(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_184(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_185(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_186(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_187(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_188(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_189(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_190(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_191(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_192(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_193(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_194(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_195(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_196(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_197(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_198(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_199(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_200(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_201(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_202(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_203(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_204(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_205(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_206(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_207(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_208(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_209(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_210(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_211(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_212(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_213(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_214(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_215(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_216(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_217(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_218(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_219(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_220(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_221(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_222(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_223(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_224(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_225(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_226(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_227(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_228(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_229(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) def NPCRefresh_230(npcRefresh, tick):__DoRefreshWorldBoss(npcRefresh, tick) ## ÊÀ½çbossË¢¹Ö # @param npcRefresh Ë¢ÐÂʵÀý # @param tick µ±Ç°Ê±¼ä # @return None def __DoRefreshWorldBoss(npcRefresh, tick): '''·Ç·ÖÁ÷µØÍ¼bossÖ»ÔÚÒ»ÏßË¢ ·ÖÁ÷µØÍ¼bossÿÌõÏß¶¼Ë¢Ð£¬ÆäËû·ÖÁ÷Ïß·bossÔÚûÈË´òµÄÇé¿öÏÂͬÉúͬËÀ ''' if GameWorld.IsCrossServer(): __DoRefreshWorldBossCrossServer(npcRefresh, tick) return rebornLineID = 0 assignLineID = 0 mapID = GameWorld.GetMap().GetMapID() refreshMark = npcRefresh.GetRefreshMark() lineID = GameWorld.GetGameWorld().GetLineID() relatedType, relatedID = 0, "" 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() stoneNPCID = 0 else: ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('BOSSInfo', {'RefreshMark':refreshMark, 'MapID':mapID}, True, isLogNone=False) if not ipyDataList: return if len(ipyDataList) == 1: ipyData = ipyDataList[0] else: # ͬµØÍ¼Í¬±êÊÔµãÓжàÌõÊý¾ÝµÄÔòΪ²»Í¬Ö¸¶¨·ÖÏß ipyData = None for ipyD in ipyDataList: refreshLine = ipyD.GetRefreshLine() rebornLineID = refreshLine - 1 if rebornLineID == lineID: ipyData = ipyD break if not ipyData: return stoneNPCID = ipyData.GetStoneNPCID() bossID = ipyData.GetNPCID() relatedType = ipyData.GetRelatedType() relatedID = ipyData.GetRelatedID() isNeedShunt = ipyData.GetIsNeedShunt() assignLineID = ipyData.GetRefreshLine() # Ö¸¶¨Ë¢ÐµÄÏß· if assignLineID > 0: rebornLineID = assignLineID - 1 if not bossID and not stoneNPCID: return gameFB = GameWorld.GetGameFB() gameWorldMgr = GameWorld.GetGameWorld() forceReborn = False # Ç¿ÖÆÖØÉú actBossRebornSign = 0 mapActBossRebornSign = 0 # ¹ØÁªÈÕ³£»î¶¯ if relatedType == 1: relatedID = int(relatedID) actionKey = ShareDefine.Def_Notify_WorldKey_DailyActionState % relatedID rebornBossState = 1 if gameWorldMgr.GetGameWorldDictByKey(actionKey) else 0 # ¹ØÁªÔËÓª»î¶¯£¬´ýÀ©Õ¹ elif relatedType == 2: actNameInfo = relatedID.split("|") actName = actNameInfo[0] if actName in ShareDefine.MultiActNumOperationActNameList: actNum = GameWorld.ToIntDef(actNameInfo[1] if len(actNameInfo) > 1 else "10") actInfo = GameWorld.GetActInfo(actName, actNum) operationActionState = actInfo.get(ShareDefine.ActKey_State, 0) else: operationActionInfo = PyGameData.g_operationActionDict.get(actName, {}) operationActionState = operationActionInfo.get(ShareDefine.ActKey_State, 0) rebornBossState = 1 if operationActionState else 0 else: bosskey = ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID rebornBossState = gameWorldMgr.GetGameWorldDictByKey(bosskey) activityLineID = 0 # »î¶¯Ïß, ĬÈÏ1Ïß activityMapLineDict = IpyGameDataPY.GetFuncEvalCfg("MapLine", 2, {}) if mapID in activityMapLineDict: activityLineID = max(0, activityMapLineDict[mapID] - 1) # ¹ØÁª»î¶¯boss if relatedType: if assignLineID == 0: # ûÓÐÖ¸¶¨Ë¢ÐÂÏß·µÄ£¬»î¶¯boss¹Ì¶¨Ë¢ÔڻÏß rebornLineID = activityLineID # »î¶¯bossֻˢÔڻÏß # ²»ÊǻÏß if rebornBossState and lineID != rebornLineID: rebornBossState = 0 # ¹ØÁª»î¶¯bossÖ»Òª¸´»î±ê¼ÇÓëÉϴβ»Í¬£¬ÔòÇ¿ÖÆÖØÉú actBossRebornSign = gameWorldMgr.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ActionBossRebornSign % relatedID) mapActBossRebornSign = gameFB.GetGameFBDictByKey(ChConfig.Map_NPC_ActBossLastRebornSign % refreshMark) rebornBossState = rebornBossState and actBossRebornSign if rebornBossState and actBossRebornSign != mapActBossRebornSign: forceReborn = True # ·Ç»î¶¯boss»î¶¯Ïß²»Ë¢, 1Ïß³ýÍâ else: if activityLineID and lineID == activityLineID: rebornBossState = 0 stoneNPCID = 0 # »î¶¯ÏßÔݲ»Ë¢Ä¹±® isNeedShunt = NPCCommon.IsMapNeedBossShunt(mapID) and isNeedShunt curNPC = None if npcRefresh.GetCount() > 0: curNPC = npcRefresh.GetAt(0) # ¸´»î״̬ if rebornBossState: if curNPC: if not forceReborn and curNPC.GetNPCID() == bossID: return #È¥µô·ÇbossNPC NPCCommon.SetDeadEx(curNPC) # ·Ç¸´»îÏß ÇÒ ²»ÐèÒª·ÖÁ÷µÄµØÍ¼ ÇÒ ²»ÊÇ·âħ̳ ²»ÔÊÐí¸´»î if lineID != rebornLineID and not isNeedShunt and mapID not in [ChConfig.Def_FBMapID_SealDemon, ChConfig.Def_FBMapID_ZhuXianBoss]: return if mapActBossRebornSign and actBossRebornSign == mapActBossRebornSign: #GameWorld.DebugLog("»î¶¯ÏßÒѾ­Ë¢¹ý²»ÔÙË¢»î¶¯boss: lineID=%s,rebornLineID=%s,refreshMark=%s,bossID=%s,actBossRebornSign=%s" # % (lineID, rebornLineID, refreshMark, bossID, actBossRebornSign)) return # ËÀÍö״̬ else: if curNPC: # ·ÖÁ÷µÄboss if curNPC.GetNPCID() == bossID and isNeedShunt and IsShuntBossNeedProcess(curNPC): return if curNPC.GetNPCID() == stoneNPCID: return # »î¶¯µÄboss if curNPC.GetNPCID() == bossID and relatedType: GameWorld.Log("»î¶¯boss£¬»î¶¯½áÊø£¬ÏµÍ³ÉèÖÃbossËÀÍö£¡bossID=%s" % bossID) if relatedID == ShareDefine.DailyActionID_FamilyRobBoss: PlayerControl.FBNotify("FairyGrabBossNoDead", [bossID]) elif relatedID == ShareDefine.OperationActionName_BossReborn: pass #È¥µô·Çű®NPC NPCCommon.SetDeadEx(curNPC) # ÑÓ³Ùˢű® bossDeadTick = gameFB.GetGameFBDictByKey(ChConfig.Map_NPC_WorldBossDeadTick % bossID) bossStoneDelayTime = IpyGameDataPY.GetFuncCfg('BossStoneDelayTime') if tick - bossDeadTick <= bossStoneDelayTime: return gameFB.SetGameFBDict(ChConfig.Map_NPC_WorldBossDeadTick % bossID, tick) rebornNPCID = bossID if rebornBossState else stoneNPCID if not rebornNPCID: return key = ChConfig.Map_NPC_WorldBossLastReBornTick % rebornNPCID lastRebornTick = gameFB.GetGameFBDictByKey(key) if tick - lastRebornTick <= 50 * 1000: # GameWorld.DebugLog("BossRefresh mapID=%s,refreshMark=%s,rebornNPCID=%s,tick=%s,lastRebornTick=%s ²»Öظ´Ë¢Ð£¡" # % (mapID,refreshMark, rebornNPCID, tick, lastRebornTick)) return npcRefresh.Refresh(rebornNPCID, ChConfig.Def_SuperBossAngryCount, 1, False) #³õʼ»¯NPC __InitNewBornNPC(npcRefresh, tick) gameFB.SetGameFBDict(key, tick) if actBossRebornSign and rebornBossState: gameFB.SetGameFBDict(ChConfig.Map_NPC_ActBossLastRebornSign % refreshMark, actBossRebornSign) GameWorld.DebugLog("BossRefresh mapID=%s,rebornLineID=%s,refreshMark=%s,rebornNPCID=%s,isNeedShunt=%s,OK!" % (mapID, rebornLineID, refreshMark, rebornNPCID, isNeedShunt), lineID) return def IsShuntBossNeedProcess(curNPC): '''·ÖÁ÷bossÊÇ·ñÐèÒª´¦Àí ÎÞÉËѪ¡¢³ðºÞ¡¢Ã»ÈË¿´µ½Ëû¡¢Ëûû¿´µ½±ðÈË ''' # ²ß»®ÔÝʱÐ޸ķÖÁ÷boss²»Í¬²½ËÀÍö return True # if curNPC.GetPlayerHurtList().GetHurtCount(): # #GameWorld.DebugLog("·ÖÁ÷bossÓÐÉËѪ£¬²»¿ÉÒÔÇå³ý£¡npcID=%s" % curNPC.GetNPCID(), GameWorld.GetGameWorld().GetLineID()) # return True # # if curNPC.GetAttentionPlayersCount() or curNPC.GetInSightObjCount(): # #GameWorld.DebugLog("·ÖÁ÷bossÓÐÈË¿´µ½£¬²»¿ÉÒÔÇå³ý£¡npcID=%s" % curNPC.GetNPCID(), GameWorld.GetGameWorld().GetLineID()) # return True # # GameWorld.DebugLog("·ÖÁ÷boss²»ÐèÒª´¦ÀíÁË£¬¿ÉÒÔÇå³ý£¡npcID=%s" % curNPC.GetNPCID(), GameWorld.GetGameWorld().GetLineID()) # return False #=================================================================================================== def __DoRefreshWorldBossCrossServer(npcRefresh, tick): ## ¿ç·þ·þÎñÆ÷Ë¢boss mapID = GameWorld.GetGameWorld().GetMapID() # dataMapID if mapID not in ChConfig.Def_CrossMapIDList: return refreshMark = npcRefresh.GetRefreshMark() lineID = GameWorld.GetGameWorld().GetLineID() realMapID = GameWorld.GetGameWorld().GetRealMapID() copyMapID = GameWorld.GetGameWorld().GetCopyMapID() relatedType, relatedID = 0, "" 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() relatedType = bossIpyData.GetRelatedType() relatedID = bossIpyData.GetRelatedID() 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 if not bossID and not stoneNPCID: return gameFB = GameWorld.GetGameFB() gameWorldMgr = GameWorld.GetGameWorld() forceReborn = False # Ç¿ÖÆÖØÉú actBossRebornSign = 0 mapActBossRebornSign = 0 # ¹ØÁªÈÕ³£»î¶¯ if relatedType == 1: relatedID = int(relatedID) actionKey = ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % relatedID rebornBossState = 1 if gameWorldMgr.GetGameWorldDictByKey(actionKey) else 0 # ¹ØÁªÔËÓª»î¶¯£¬´ýÀ©Õ¹ elif relatedType == 2: pass else: bosskey = ShareDefine.Def_Notify_WorldKey_GameWorldBossRebornCross % (zoneID, bossID) rebornBossState = GameWorld.GetGameWorld().GetGameWorldDictByKey(bosskey) # ¹ØÁª»î¶¯boss if relatedType: # ¹ØÁª»î¶¯bossÖ»Òª¸´»î±ê¼ÇÓëÉϴβ»Í¬£¬ÔòÇ¿ÖÆÖØÉú actBossRebornSign = gameWorldMgr.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ActionBossRebornSign % relatedID) mapActBossRebornSign = gameFB.GetGameFBDictByKey(ChConfig.Map_NPC_ActBossLastRebornSign % refreshMark) rebornBossState = rebornBossState and actBossRebornSign if rebornBossState and actBossRebornSign != mapActBossRebornSign: forceReborn = True curNPC = None if npcRefresh.GetCount() > 0: curNPC = npcRefresh.GetAt(0) # ¸´»î״̬ if rebornBossState: if curNPC: if not forceReborn and curNPC.GetNPCID() == bossID: return #È¥µô·ÇbossNPC NPCCommon.SetDeadEx(curNPC) if mapActBossRebornSign and actBossRebornSign == mapActBossRebornSign: #GameWorld.DebugLog("»î¶¯ÏßÒѾ­Ë¢¹ý²»ÔÙË¢»î¶¯boss: lineID=%s,refreshMark=%s,bossID=%s,actBossRebornSign=%s" # % (lineID, refreshMark, bossID, actBossRebornSign)) return # ËÀÍö״̬ else: if curNPC: if curNPC.GetNPCID() == stoneNPCID: return #È¥µô·Çű®NPC NPCCommon.SetDeadEx(curNPC) # ÑÓ³Ùˢű® bossDeadTick = gameFB.GetGameFBDictByKey(ChConfig.Map_NPC_WorldBossDeadTick % bossID) bossStoneDelayTime = IpyGameDataPY.GetFuncCfg('BossStoneDelayTime') if tick - bossDeadTick <= bossStoneDelayTime: return gameFB.SetGameFBDict(ChConfig.Map_NPC_WorldBossDeadTick % bossID, tick) rebornNPCID = bossID if rebornBossState else stoneNPCID if not rebornNPCID: return rebornTickKey = ChConfig.Map_NPC_WorldBossLastReBornTick % rebornNPCID lastRebornTick = gameFB.GetGameFBDictByKey(rebornTickKey) if tick - lastRebornTick <= 50 * 1000: GameWorld.DebugLog("CrossBossRefresh mapID=%s,realMapID=%s,copyMapID=%s,refreshMark=%s,rebornNPCID=%s,tick=%s,lastRebornTick=%s ²»Öظ´Ë¢Ð£¡" % (mapID, realMapID, copyMapID, refreshMark, rebornNPCID, tick, lastRebornTick)) return npcRefresh.Refresh(rebornNPCID, ChConfig.Def_SuperBossAngryCount, 1, False) #³õʼ»¯NPC __InitNewBornNPC(npcRefresh, tick) gameFB.SetGameFBDict(rebornTickKey, tick) if actBossRebornSign and rebornBossState: gameFB.SetGameFBDict(ChConfig.Map_NPC_ActBossLastRebornSign % refreshMark, actBossRebornSign) GameWorld.DebugLog("CrossBossRefresh mapID=%s,realMapID=%s,copyMapID=%s,refreshMark=%s,rebornNPCID=%s,OK!" % (mapID, realMapID, copyMapID, refreshMark, rebornNPCID), lineID) return ################################ ͨÓÃË¢¹ÖÂß¼­ #################################### def GetNPCRefreshCountList(refreshID): ## »ñȡˢ¹Ö±êʶµã¹æÔòIDÐèҪˢеÄNPC¸öÊýÐÅÏ¢£» ## ¸Ãº¯ÊýÖ»ÊÊÓÃÓڹ̶¨Ë¢¹ÖµÄ¹æÔò ipyData = IpyGameDataPY.GetIpyGameData("NPCCustomRefresh", refreshID) if not ipyData: return npcID = ipyData.GetRefreshNPCID() if npcID: return [(npcID, ipyData.GetTotalMaxCount())] npcCountList = ipyData.GetNPCIDCountList() if npcCountList: return npcCountList return def SetNPCRefreshByID(refreshID, angry=ChConfig.Def_NormalNPCAngryCount, isStart=True, refreshRightNow=True): ipyData = IpyGameDataPY.GetIpyGameData("NPCCustomRefresh", refreshID) if not ipyData: return rMarkList = ipyData.GetRefreshMarkInfo() npcID = ipyData.GetRefreshNPCID() npcIDList = [] if npcID: npcIDList = [npcID] else: randNPCIDList = ipyData.GetRandNPCIDList() npcCountList = ipyData.GetNPCIDCountList() if randNPCIDList: npcIDList = randNPCIDList elif npcCountList: npcIDList = npcCountList if not npcIDList: GameWorld.ErrLog("Ë¢¹Ö±êÊÔµãûÓÐÅäÖÃҪˢеÄNPCIDÐÅÏ¢£¡ID=%s" % refreshID) return # ±êʶµãËæ»ú rMark = None if len(rMarkList) > 1: gameFB = GameWorld.GetGameFB() for _ in xrange(100): randMark = random.choice(rMarkList) if not gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCID % (randMark, 0)): rMark = randMark #GameWorld.DebugLog("Ëæ»ú±êʶµãË¢¹Ö¹æÔò: ID=%s,rMark=%s,rMarkList=%s" % (refreshID, rMark, rMarkList)) break else: rMark = rMarkList[0] #GameWorld.DebugLog("¹Ì¶¨±êʶµãË¢¹Ö¹æÔò: ID=%s,rMark=%s" % (refreshID, rMark)) if rMark == None: GameWorld.ErrLog("ÎÞ·¨»ñµÃÖ¸¶¨µÄË¢¹Ö±êÊԵ㣡refreshID=%s" % refreshID) return SetNPCRefresh(rMark, npcIDList, ipyData.GetMaxCount(), ipyData.GetTotalMaxCount(), angry, isStart, ipyData.GetIsLineOneOnly(), ipyData.GetIsRepeat(), ipyData.GetRefreshTick(), refreshRightNow) return ## ÉèÖÃͨÓÃË¢¹ÖÐÅÏ¢ # @param rMark Ë¢¹Ö±êʶµã # @param npcIDList npcIDÁбí, Ö§³ÖÁ½ÖÖģʽ: Ëæ»ú[npcID,npcID,...] »ò Ö¸¶¨[(npcID,¸öÊý),(npcID,¸öÊý),...] # @param maxCnt µ±Ç°µã×î´ó¹ÖÎïÊý, ĬÈÏË¢1Ö» # @param totalMaxCnt ×Ü×î´ó¹ÖÎïÊý, ĬÈÏË¢1Ö», ͬһÕŵØÍ¼Í¬Ò»±êʶµã¿ÉÄÜÓжà¸ö; µ±Ñ­»·Ë¢¹Öʱ£¬¸ÃÖµÎÞÓã¬Ö»Í¨¹ýÿ¸öµãµÄ×î´ó¹ÖÎïÊý¿ØÖÆ # @param angry ¹ÖÎï³ðºÞÖµ£¬Ä¬ÈÏÆÕͨNPC³ðºÞ # @param isStart ÊÇ·ñÂíÉÏ¿ªÆôË¢¹Ö # @param isLineOneOnly ÊÇ·ñ½öÔÚÒ»ÏßË¢¹Ö # @param isRepeat ÊÇ·ñÑ­»·Ë¢¹Ö(·ÇÑ­»·Ë¢¹ÖʱÔÚË¢¹Öµã¹ÖÎïÊý´ïµ½×î´óʱ»á×Ô¶¯¹Ø±ÕË¢¹Ö) # @param refreshTick Ë¢¹Ö¼ä¸ô # @param refreshRightNow ÊÇ·ñÂíÉÏ´¥·¢Ë¢¹ÖÂß¼­ # @param isForceRefresh Ç¿ÖÆµãList£¬Îª¿ÕʱÕý³£Ë¢¹Ö¡£[rMark1, rMark2,...] # @return None def SetNPCRefresh(rMark, npcIDList, maxCnt=1, totalMaxCnt=1, angry=ChConfig.Def_NormalNPCAngryCount, isStart=True, isLineOneOnly=False, isRepeat=False, refreshTick=0, refreshRightNow=True, isForceRefreshList=[]): gameFB = GameWorld.GetGameFB() if not isinstance(npcIDList, list): return pointCnt = len(isForceRefreshList) if pointCnt > 0: gameNPC = GameWorld.GetNPCManager() recordPointList = [] for i in range(0, gameNPC.GetCustomNPCRefreshCount()): npcRefresh = gameNPC.GetCustomNPCRefreshAt(i) if npcRefresh.GetRefreshMark() in isForceRefreshList: recordPointList.append(i) totalCnt = len(recordPointList) gameFB.SetGameFBDict(ChConfig.Def_RMark_TotalForcePointCnt, totalCnt) for index, pointIndex in enumerate(recordPointList): gameFB.SetGameFBDict(ChConfig.Def_RMark_ForceRefreshPoint % index, pointIndex) npcIDLen = len(npcIDList) gameFB.SetGameFBDict(ChConfig.Def_RMark_NPCListLen % rMark, npcIDLen) for i, npcInfo in enumerate(npcIDList): if isinstance(npcInfo, int): npcID = npcInfo npcCnt = 0 # ´ú±íËæ»ú else: npcID, npcCnt = npcInfo gameFB.SetGameFBDict(ChConfig.Def_RMark_NPCID % (rMark, i), npcID) gameFB.SetGameFBDict(ChConfig.Def_RMark_NPCIDCnt % (rMark, i), npcCnt) gameFB.SetGameFBDict(ChConfig.Def_RMark_MaxCnt % rMark, maxCnt) gameFB.SetGameFBDict(ChConfig.Def_RMark_TotalMaxCnt % rMark, totalMaxCnt) gameFB.SetGameFBDict(ChConfig.Def_RMark_RefreshCnt % rMark, 0) gameFB.SetGameFBDict(ChConfig.Def_RMark_AngryCount % rMark, angry) gameFB.SetGameFBDict(ChConfig.Def_RMark_LineOneOnly % rMark, int(isLineOneOnly)) gameFB.SetGameFBDict(ChConfig.Def_RMark_RefreshTick % rMark, refreshTick) gameFB.SetGameFBDict(ChConfig.Def_RMark_IsRepeat % rMark, int(isRepeat)) if isStart: StartNPCRefresh(rMark) GameWorld.Log("ÉèÖñêʶµãÐÅÏ¢£ºmark=%s,npcList=%s,max=%s,tMax=%s,angry=%s,start=%s,lineOneOnly=%s,repeat=%s,refreshTick=%s,refreshRightNow=%s" % (rMark, npcIDList, maxCnt, totalMaxCnt, angry, isStart, isLineOneOnly, isRepeat, refreshTick, refreshRightNow)) if isStart and refreshRightNow: tick = GameWorld.GetGameWorld().GetTick() ProcessAllNPCRefresh(tick) return ## ¿ªÆôͨÓÃNPCË¢¹Ö # @param rMark Ë¢¹Ö±êʶµã # @return None def StartNPCRefresh(rMark): gameFB = GameWorld.GetGameFB() gameFB.SetGameFBDict(ChConfig.Def_RMark_State % rMark, 1) return ## ¹Ø±ÕͨÓÃNPCË¢¹Ö # @param rMark Ë¢¹Ö±êʶµã # @return None def CloseNPCRefresh(rMark, tick): gameFB = GameWorld.GetGameFB() if not gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_State % rMark): return gameFB.SetGameFBDict(ChConfig.Def_RMark_State % rMark, 0) FBLogic.OnCloseNPCRefresh(rMark, tick) GameWorld.DebugLog("CloseNPCRefresh rMark=%s" % rMark) return ## ¹Ø±Õ¸±±¾ËùÓÐͨÓÃNPCË¢¹Ö def CloseFBCustomRefresh(tick): gameNPC = GameWorld.GetNPCManager() for i in xrange(gameNPC.GetCustomNPCRefreshCount()): npcRefresh = gameNPC.GetCustomNPCRefreshAt(i) CloseNPCRefresh(npcRefresh.GetRefreshMark(), tick) return ## »ñÈ¡ÒѾ­Ë¢ÐµĹÖÎïÊý def GetHadRefreshCnt(rMark): return GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.Def_RMark_RefreshCnt % rMark) ## ͨÓñêʶµãË¢¹ÖÂß¼­ # @param npcRefresh Ë¢ÐÂʵÀý # @param tick µ±Ç°Ê±¼ä # @return None def __NPCCommonRefresh(pointIndex, npcRefresh, tick): gameFB = GameWorld.GetGameFB() rMark = npcRefresh.GetRefreshMark() rMarkStateKey = ChConfig.Def_RMark_State % rMark # Ë¢¹ÖÊÇ·ñ¿ªÆô if gameFB.GetGameFBDictByKey(rMarkStateKey) == 0: return # Ö»ÔÚÒ»ÏßË¢ isLineOneOnlyKey = ChConfig.Def_RMark_LineOneOnly % rMark if gameFB.GetGameFBDictByKey(isLineOneOnlyKey) and GameWorld.GetGameWorld().GetLineID() != 0: return refreshTick = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_RefreshTick % rMark) curMaxCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_MaxCnt % rMark) totalMaxCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_TotalMaxCnt % rMark) refreshCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_RefreshCnt % rMark) npcListLen = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCListLen % rMark) angryCount = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_AngryCount % rMark) isRepeat = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_IsRepeat % rMark) totalForceCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_TotalForcePointCnt) isForce = totalForceCnt > 0 if npcListLen <= 0: return indexList = [] # ÐèÒª²¹³ä¶àÉÙnpc needNPCCnt = curMaxCnt - npcRefresh.GetCount() if not isRepeat: needNPCCnt = min(needNPCCnt, totalMaxCnt - refreshCnt) if isForce: for index in xrange(totalForceCnt): indexList.append(gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_ForceRefreshPoint % index)) if pointIndex in indexList: needNPCCnt = curMaxCnt if needNPCCnt <= 0: if npcRefresh.GetRefreshTick() != 1: npcRefresh.SetRefreshTick(1) return # npcËÀºó²Å¿ªÊ¼¼ÆÊ± lastRefreshTick = npcRefresh.GetRefreshTick() if lastRefreshTick == 1: npcRefresh.SetRefreshTick(tick) needSyc = False # µÚÒ»´ÎûÓÐË¢¹Ö¼ä¸ôÏÞÖÆ if lastRefreshTick > 0 and tick - npcRefresh.GetRefreshTick() < refreshTick * 1000: #²»ÊÇÇ¿ÖÆË¢Ð²»´¦Àí if isForce and pointIndex in indexList\ and npcRefresh.GetCount() == 0 and gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_HasRefreshPoint % pointIndex) == 0: gameFB.SetGameFBDict(ChConfig.Def_RMark_HasRecordPoint % pointIndex, 1) for point in indexList: mark = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_HasRecordPoint % point) if not mark: return GameWorld.DebugLog("ͨ¹ý£¡£¡£¡£¡---%s--mark:%s"%(point,mark)) gameFB.SetGameFBDict(ChConfig.Def_RMark_HasRefreshPoint % pointIndex, 1) passCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_PassCnt) + 1 gameFB.SetGameFBDict(ChConfig.Def_RMark_PassCnt, passCnt) if passCnt == len(indexList): for point2 in indexList: gameFB.SetGameFBDict(ChConfig.Def_RMark_PassCnt, 0) gameFB.SetGameFBDict(ChConfig.Def_RMark_HasRecordPoint % point2, 0) gameFB.SetGameFBDict(ChConfig.Def_RMark_HasRefreshPoint % point2, 0) needSyc = True else: return elif isForce: gameFB.SetGameFBDict(ChConfig.Def_RMark_PassCnt, 0) gameFB.SetGameFBDict(ChConfig.Def_RMark_HasRecordPoint % pointIndex, 0) gameFB.SetGameFBDict(ChConfig.Def_RMark_HasRefreshPoint % pointIndex, 0) timePassCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_TimePassCnt) + 1 if timePassCnt == len(indexList): gameFB.SetGameFBDict(ChConfig.Def_RMark_TimePassCnt, 0) needSyc = True else: gameFB.SetGameFBDict(ChConfig.Def_RMark_TimePassCnt, timePassCnt) if needSyc: refresh = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_RefreshStep) + 1 gameFB.SetGameFBDict(ChConfig.Def_RMark_RefreshStep, refresh) FBLogic.OnPointRefresh(refresh,tick) npcID = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCID % (rMark, 0)) npcCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCIDCnt % (rMark, 0)) # Ö¸¶¨NPC¼°Ö»Êý if npcCnt > 0: for i in xrange(npcListLen): npcID = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCID % (rMark, i)) npcCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCIDCnt % (rMark, i)) if npcID <= 0: continue GameWorld.DebugLog("Ö¸¶¨Ë¢¹Ö£ºrMark=%s,npcID=%s,angryCount=%s,refreshCnt=%s" % (rMark, npcID, angryCount, npcCnt)) npcRefresh.Refresh(npcID, angryCount, npcCnt, False) __InitNewBornNPC(npcRefresh , tick) refreshCnt += npcCnt elif npcListLen > 1: for i in xrange(needNPCCnt): npcIndex = random.randint(0, npcListLen - 1) npcID = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCID % (rMark, npcIndex)) if npcID <= 0: continue GameWorld.DebugLog("Ëæ»úË¢¹Ö£ºrMark=%s,npcID=%s,angryCount=%s,refreshCnt=%s" % (rMark, npcID, angryCount, 1)) npcRefresh.Refresh(npcID, angryCount, 1, False) __InitNewBornNPC(npcRefresh , tick) refreshCnt += 1 else: npcID = gameFB.GetGameFBDictByKey(ChConfig.Def_RMark_NPCID % (rMark, 0)) if not npcID: return GameWorld.DebugLog("µ¥Ö»Ë¢¹Ö£ºrMark=%s,npcID=%s,angryCount=%s,refreshCnt=%s" % (rMark, npcID, angryCount, needNPCCnt)) npcRefresh.Refresh(npcID, angryCount, needNPCCnt, False) __InitNewBornNPC(npcRefresh , tick) refreshCnt += needNPCCnt # ³õʼ»¯NPC if not isRepeat: gameFB.SetGameFBDict(ChConfig.Def_RMark_RefreshCnt % rMark, refreshCnt) # ·ÇÑ­»·Ë¢¹ÖµÄ£¬Ë¢Íê¹Öºó¹Ø±ÕË¢¹Ö GameWorld.DebugLog("ÒÑˢйÖÎï=%s,total=%s" % (refreshCnt, totalMaxCnt)) if refreshCnt >= totalMaxCnt and not isRepeat: CloseNPCRefresh(rMark, tick) return ################################################################################ def ProcessMapRandomRefreshNPC(gameWorld, tick): ''' µØÍ¼×Ô¶¨ÒåËæ»úË¢¹Ö£¬Ö§³Ö¶àµãËæ»úË¢¶àÖÖ¹Ö£¬±êÊԵ㲻¿ÉÖØ¸´£¬Ö§³Ö¿ç·þµØÍ¼ ×¢Ò⣺ͬ¸öÐéÄâÏß·ÖУ¬±êÊԵ㲻¿ÉÖØ¸´£¡±êÊԵ㲻¿ÉÖØ¸´£¡±êÊԵ㲻¿ÉÖØ¸´£¡ ''' if gameWorld.GetOpenState() != IPY_GameWorld.fbosOpen: #ÒѾ­¹Ø±ÕÁË return mapID = gameWorld.GetMapID() refreshIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("MapRefreshNPC", mapID) if not refreshIpyDataList: return #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 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 needRefreshIpyDataList: #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("±êÊÔµã¹ÖÎïÊý: 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: curTotalCount += npcCountDict.get(rMark, 0) refreshCount = totalMaxCount - curTotalCount #GameWorld.DebugLog(" npcIDList=%s,markList=%s,curTotalCount=%s,totalMaxCount=%s,refreshCount=%s" # % (npcIDList, markList, curTotalCount, totalMaxCount, refreshCount), copyMapID) if refreshCount <= 0: continue 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) 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 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