hxp
2019-02-19 cda5e4e81f17542946ac53e77d2cd625ac2ea3d4
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
@@ -1039,38 +1091,6 @@
        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():
                continue
            if PlayerControl.GetIsTJG(curPlayer):
                continue
            NetPackCommon.SendFakePack(curPlayer, packData)
    else:
        if PlayerControl.GetIsTJG(curPlayer):
            return
        NetPackCommon.SendFakePack(curPlayer, packData)
    return
## -----------------------------------------------------------------------------------------------
def OnFamilyKillHorsePetRobBoss(killFamilyName):
@@ -1217,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