From 1a4ac6183072f417c90832baaa8ad8ece44d99b5 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 12 二月 2019 11:39:41 +0800 Subject: [PATCH] 2996 【1.6】boss区域重登,伤血被清空 --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py | 165 +++++++++++++++++++++++++++++++----------------------- 1 files changed, 94 insertions(+), 71 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py index db89328..b8430ba 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py @@ -38,14 +38,16 @@ import PlayerUniversalGameRec import PlayerCompensation import IpyGameDataPY -import MergePlayer import PyGameDataStruct +import CrossRealmPlayer import PyDataManager import PlayerControl +import CrossRealmMsg import CommFunc import PyGameData import PlayerGeTui import IPY_GameServer +import CrossBoss import time @@ -102,12 +104,13 @@ if bossID <= 0: return - # 设置不存活,击杀玩家名 - killPlayerName = msgList[1] - hurtValue = msgList[2] - isAddKillCnt = msgList[3] - isNotify = msgList[4] if len(msgList) > 4 else True - mapID = msgList[5] if len(msgList) > 5 else None + bossID, killPlayerName, hurtValue, isNotify, realMapID, dataMapID, copyMapID, killerIDList = msgList + if GameWorld.IsCrossServer(): + CrossBoss.DoCrossBossOnKilled(bossID, killPlayerName, realMapID, dataMapID, copyMapID, killerIDList) + return + + mapID = dataMapID + isAddKillCnt = False isMapNeedShunt = IsMapNeedBossShunt(mapID) isAlive = __GetIsAlive(bossID) @@ -158,10 +161,12 @@ if len(msgList) <= 0: return - bossID = msgList[0] - isAlive = msgList[1] - mapID = msgList[2] if len(msgList) > 2 else None - lineID = msgList[3] if len(msgList) > 3 else None + bossID, isAlive, dataMapID, realMapID, copyMapID = msgList + if GameWorld.IsCrossServer(): + CrossBoss.DoCrossBossStateChange(bossID, isAlive, dataMapID, realMapID, copyMapID) + return + + mapID, lineID = dataMapID, copyMapID GameWorld.Log("世界boss状态变更: mapID=%s,lineID=%s,bossID=%s,state=%s,tick=%s" % (mapID, lineID, bossID, isAlive, tick)) if bossID <= 0: @@ -213,7 +218,7 @@ recTypeListData = __GetBossPrizeRecData() # 查找是否已有记录 bossRec = None - for index in range(recTypeListData.Count()): + for index in xrange(recTypeListData.Count()): universalRecData = recTypeListData.At(index) if universalRecData.GetValue1() == bossID: bossRec = universalRecData @@ -306,6 +311,20 @@ # # return +#// A9 04 查询boss信息 #tagCGQueryBossInfo +# +# +#struct tagCGQueryBossInfo +#{ +# tagHead Head; +# BYTE Count; //数量 +# DWORD BossIDList[Count]; //boosid +#}; +def OnQueryBossInfo(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + bossIDList = clientData.BossIDList + Sync_BossInfo(curPlayer, bossIDList) + return ## 同步boss相关信息 @@ -319,12 +338,18 @@ recTypeListData = __GetBossPrizeRecData() bossInfo.BossInfoList = [] #GameWorld.DebugLog("Sync_BossInfo...count=%s,curTime=%s" % (recTypeListData.Count(), curTime)) - for index in range(recTypeListData.Count()): + for index in xrange(recTypeListData.Count()): universalRecData = recTypeListData.At(index) bossID = universalRecData.GetValue1() if not bossID: continue if syncBOSSIDList and bossID not in syncBOSSIDList: + continue + ipyData = IpyGameDataPY.GetIpyGameData('BOSSInfo', bossID) + if not ipyData: + continue + mapID = ipyData.GetMapID() + if mapID in ChConfig.Def_CrossMapIDList: continue bossInfoObj = ChPyNetSendPack.tagBossInfoObj() bossInfoObj.BossID = bossID @@ -346,7 +371,7 @@ if not curPlayer: # 全服广播在线玩家 playerManager = GameWorld.GetPlayerManager() - for i in range(0, playerManager.GetActivePlayerCount()): + for i in xrange(playerManager.GetActivePlayerCount()): curPlayer = playerManager.GetActivePlayerAt(i) if curPlayer == None or not curPlayer.GetInitOK(): continue @@ -366,6 +391,9 @@ if not GameWorld.SetWorldDictKey(ChConfig.TYPE_WorldBossProcessTick, tick): #间隔未到 return + if GameWorld.IsCrossServer(): + CrossBoss.DoCheckCrossBossReborn(tick) + return curTime = int(time.time()) DoCheckWorldBossShuntInfo(curTime, tick) BossRebornWorldNotify(curTime) @@ -373,6 +401,9 @@ for i in xrange(IpyGameDataPY.IPY_Data().GetBOSSInfoCount()): ipyData = IpyGameDataPY.IPY_Data().GetBOSSInfoByIndex(i) bossID = ipyData.GetNPCID() + mapID = ipyData.GetMapID() + if mapID in ChConfig.Def_CrossMapIDList: + continue bossPrizeRec = __GetBossRecDataByID(bossID) killedTime = bossPrizeRec.GetValue2() refreshTime = __GetBossRefreshTime(bossID) @@ -413,7 +444,8 @@ if not GameWorld.SetWorldDictKey(ChConfig.TYPE_WorldBossGeTuiTick, tick): #间隔未到 return - + if GameWorld.IsCrossServer(): + return curTime = int(time.time()) for bossInfo in PyGameData.g_sortBOSSRefreshList: bossID, killedTime, refreshTime = bossInfo @@ -446,11 +478,14 @@ for i in xrange(IpyGameDataPY.IPY_Data().GetBOSSInfoCount()): ipyData = IpyGameDataPY.IPY_Data().GetBOSSInfoByIndex(i) bossID = ipyData.GetNPCID() + mapID = ipyData.GetMapID() + if mapID in ChConfig.Def_CrossMapIDList: + continue isAlive = __GetIsAlive(bossID) if not isAlive: continue mapID = ipyData.GetMapID() - if mapID != ChConfig.Def_FBMapID_SealDemon: + if mapID not in ChConfig.WorldBossFBMapIDList: GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID, 1) return @@ -458,6 +493,7 @@ # @param curPlayer # @return None def OnPlayerLogin(curPlayer): + CrossBoss.OnPlayerLogin(curPlayer) Sync_BossInfo(curPlayer) PyDataManager.GetBossAttentionManager().NotifyBossAttentionInfo(curPlayer) if IsMapNeedBossShunt(0): @@ -467,22 +503,20 @@ state = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_OperationActionState % ShareDefine.OperationActionName_BossReborn) if state: Sync_BossRebornPoint(curPlayer) - Sync_DogzNPCRefreshTime(curPlayer) return ## 地图启动ok通知 # @param None # @return None def OnMapServerInitOK(): + if GameWorld.IsCrossServer(): + CrossBoss.OnCrossMapServerInitOK() + return SendMapServerBossKilledCnt() __SendMapServerAliveBoss() if IsMapNeedBossShunt(0): GameWorld.SendCommMapServerMsg(ShareDefine.Def_Notify_WorldKey_BossShuntPlayer, PyGameData.g_bossShuntPlayerInfo) GameWorld.SendCommMapServerMsg(ShareDefine.Def_Notify_WorldKey_BossShuntLineState, PyGameData.g_bossShuntLineState) - #通知一个参数 - bossID = IpyGameDataPY.GetFuncCfg('DogzFBRefreshCfg', 2) - onlineCnt = __GetBossOnlineHeroCnt(bossID)[0] - GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_BossOnlineHeroCnt % bossID, onlineCnt) #仙盟击杀骑宠boss数 if PyGameData.g_familyKillHorsePetRobBossCntDict: @@ -492,16 +526,37 @@ ##-------------------------------------------------------------------------------------------------- +def CrossServerMsg_DropGoodItem(msgList, tick): + ## 收到跨服服务器同步的掉落好物品信息 + playerID = msgList[0] + curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) + if curPlayer: + msgList[1] = curPlayer.GetName() # 本服玩家在线,修改为本服玩家的名字展示 + OnKillBossDropGoodItem(msgList, tick) + return + def OnKillBossDropGoodItem(msgList, tick): # playerName, mapID, npcID, itemID, userData - if len(msgList) != 7: + if len(msgList) != 8: return - playerID, killerName, mapID, npcID, itemID, userData, weightValue = msgList - GameWorld.DebugLog("击杀Boss掉落好物品: mapID=%s,npcID=%s,killerName=%s,itemID=%s, userData=%s, weightValue=%s" - % (mapID, npcID, killerName, itemID, userData, weightValue)) + playerID, killerName, mapID, npcID, itemID, userData, weightValue, serverGroupID = msgList + GameWorld.DebugLog("击杀Boss掉落好物品: mapID=%s,npcID=%s,killerName=%s,itemID=%s, userData=%s, weightValue=%s, serverGroupID=%s" + % (mapID, npcID, killerName, itemID, userData, weightValue, serverGroupID)) maxRecordCnt = IpyGameDataPY.GetFuncCfg('DropRecordNum') if not maxRecordCnt: return + + if GameWorld.IsCrossServer(): + # 同步到玩家对应子服 + if not serverGroupID: + return + zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByServerGroupID(serverGroupID) + if not zoneIpyData: + return + serverGroupIDList = zoneIpyData.GetServerGroupIDList() + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_DropGoodItem, msgList, serverGroupIDList) + return + recType = ShareDefine.Def_UniversalGameRecType_BossDropGoodItemInfo universalRecMgr = GameWorld.GetUniversalRecMgr() recordList = universalRecMgr.GetTypeList(recType) @@ -531,6 +586,9 @@ PlayerUniversalGameRec.MapServer_UniversalGameRec(None, recType, [mapID, npcID, itemID, playerID, weightValue], [killerName, "", userData]) + + msgList = [killerName, playerID, mapID, npcID, itemID, userData] + PlayerControl.WorldNotify(0, 'DropRecord' , msgList) return @@ -542,11 +600,16 @@ if not GameWorld.SetWorldDictKey(ChConfig.TYPE_WorldBossOnlineCntTick, tick): #间隔未到 return + if GameWorld.IsCrossServer(): + return GameWorld.DebugLog('世界boss在线人数统计') bossRebornDict = {} for i in xrange(IpyGameDataPY.IPY_Data().GetBOSSInfoCount()): ipyData = IpyGameDataPY.IPY_Data().GetBOSSInfoByIndex(i) bossID = ipyData.GetNPCID() + mapID = ipyData.GetMapID() + if mapID in ChConfig.Def_CrossMapIDList: + continue refreshTimeStr = ipyData.GetRefreshTime() if 'onlineCnt' in refreshTimeStr: bossRebornDict[bossID] = ipyData.GetLVLimit() @@ -566,15 +629,6 @@ if lvLimit[0] <= findLV <= lvLimit[1]: playerCntDict[bossid] = playerCntDict.get(bossid, 0) + 1 GameWorld.DebugLog(' boss等级信息对应本服在线人数 %s' % playerCntDict) - - # 此处需要统计累加当前在跨服服务器的玩家 - mergeServerOnlinePlayerDict = MergePlayer.GetMergeServerOnlinePlayerInfo() - for playerInfo in mergeServerOnlinePlayerDict.values(): - findLV = playerInfo[MergePlayer.Def_MSOLPlayer_LV] - for bossid, lvLimit in bossRebornDict.items(): - if lvLimit[0] <= findLV <= lvLimit[1]: - playerCntDict[bossid] = playerCntDict.get(bossid, 0) + 1 - GameWorld.DebugLog(' boss等级信息对应本服及跨服在线人数 %s' % playerCntDict) for bossid, curOnlineCnt in playerCntDict.items(): SetBossOnlineHeroCnt(bossid, curOnlineCnt) @@ -601,8 +655,6 @@ newNum = newOnlieCnt * 100 + unUpdataCnt PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_GameWorldBossOnlineCnt % bossid, newNum) - if bossid == IpyGameDataPY.GetFuncCfg('DogzFBRefreshCfg', 2): - GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_BossOnlineHeroCnt % bossid, newOnlieCnt) GameWorld.DebugLog("设置计算boss刷新时间用的在线人数 Change:bossid=%s, beforeOnlineCnt = %s, newOnlieCnt = %s, unUpdataCnt=%s" % (bossid, beforeOnlineCnt, newOnlieCnt, unUpdataCnt)) return @@ -619,7 +671,8 @@ return onlineCnt = __GetBossOnlineHeroCnt(bossid)[0] LVLimit = ipyData.GetLVLimit() - if PyGameData.g_yesterdayPlayerLVDict: + openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + if openServerDay != 0 and LVLimit and len(LVLimit) == 2: yesterdayCnt = len([1 for lv in PyGameData.g_yesterdayPlayerLVDict.values() if LVLimit[0]<=lv <= LVLimit[1]]) #参数昨日活跃人数 else: yesterdayCnt = IpyGameDataPY.GetFuncCfg('FirstDayActivePlayerCnt') @@ -949,8 +1002,10 @@ refreshTime = 0 PyGameData.g_sortBOSSRefreshList[i] = [bossID, killedTime, refreshTime] bossIDList.append(bossID) + curTime = int(time.time()) + PyGameData.g_sortBOSSRefreshList.sort(key=lambda asd:max(0, asd[2] - (curTime - asd[1]))) GameWorld.Log(' boss复活活动 重生boss bossIDList=%s'%bossIDList) - g_lastBossRebornTime = int(time.time()) + g_lastBossRebornTime = curTime else: #广播 needNotifyPointPerList = IpyGameDataPY.GetFuncEvalCfg('BossRebornNotify') @@ -1023,38 +1078,6 @@ packData.RebornCnt = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_BossRebornCnt) playerManager = GameWorld.GetPlayerManager() if not curPlayer: - for i in xrange(playerManager.GetActivePlayerCount()): - curPlayer = playerManager.GetActivePlayerAt(i) - if curPlayer == None or not curPlayer.GetInitOK(): - continue - if PlayerControl.GetIsTJG(curPlayer): - continue - NetPackCommon.SendFakePack(curPlayer, packData) - else: - if PlayerControl.GetIsTJG(curPlayer): - return - NetPackCommon.SendFakePack(curPlayer, packData) - return - -def Sync_DogzNPCRefreshTime(curPlayer=None): - #同步神兽副本NPC刷新时间 - refreshTimeDict = PyGameData.g_dogzNPCRefreshTimeDict - - if not refreshTimeDict: - return - curTime = int(time.time()) - packData = ChPyNetSendPack.tagGCDogzNPCRefreshTime() - packData.InfoList=[] - for npcid, timeinfo in refreshTimeDict.items(): - lastRefreshTime, nextNeedTime = timeinfo - remainTime = max(0, nextNeedTime - curTime + lastRefreshTime) - timeInfo = ChPyNetSendPack.tagDogzTimeInfoObj() - timeInfo.NPCID = npcid - timeInfo.RefreshSecond = remainTime - packData.InfoList.append(timeInfo) - packData.Cnt = len(packData.InfoList) - if not curPlayer: - playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetActivePlayerCount()): curPlayer = playerManager.GetActivePlayerAt(i) if curPlayer == None or not curPlayer.GetInitOK(): @@ -1214,6 +1237,6 @@ if curMember.GetFamilyLV() == IPY_GameServer.fmlMember: GameWorld.DebugLog("普通成员无法召集!", playerID) return - PlayerControl.FamilyNotify(curFamily.GetID(), "FairyGrabBossHelp", [npcID]) + PlayerControl.FamilyNotify(curFamily.GetID(), "FairyGrabBossHelp", [curPlayer.GetName(), npcID]) return -- Gitblit v1.8.0