hxp
2022-02-21 0c27822ef5e6c67782ed143a4ff03ecfbdfda1fb
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py
@@ -4,12 +4,12 @@
#
##@package CrossBattlefield
#
# @todo:跨服战场
# @todo:跨服战场/古神战场
# @author hxp
# @date 2022-01-06
# @version 1.0
#
# 详细描述: 跨服战场
# 详细描述: 跨服战场/古神战场
#
#-------------------------------------------------------------------------------
#"""Version = 2022-01-06 20:30"""
@@ -180,10 +180,13 @@
    if not GameWorld.IsCrossServer():
        return
    
    enterWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboard", 3, {}) # 周参与榜名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
    callWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboard", 4, {}) # 周召集榜名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
    scoreWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboard", 5, {}) # 周参与榜名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
    enterWeekMoneyItemID = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboardJoin", 3) # 周参与榜额外奖励货币物品ID
    enterWeekMoneyMultiDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboardJoin", 4, {}) # 周参与榜额外奖励货币名次对应倍值
    enterWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboardJoin", 2, {}) # 周参与榜名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
    callWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboard", 2, {}) # 周召集榜名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
    scoreWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboard", 3, {}) # 周积分榜名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
    
    enterWeekMoneyMultiIntDict = {int(k):v for k, v in enterWeekMoneyMultiDict.items()}
    enterWeekOrderIntAwardDict = {int(k):v for k, v in enterWeekOrderAwardDict.items()}
    callWeekOrderIntAwardDict = {int(k):v for k, v in callWeekOrderAwardDict.items()}
    scoreWeekOrderIntAwardDict = {int(k):v for k, v in scoreWeekOrderAwardDict.items()}
@@ -209,11 +212,17 @@
                if not billboardData:
                    continue
                playerID = billboardData.ID
                cmpValue = billboardData.CmpValue
                rank = i + 1
                awardItemList = GameWorld.GetOrderValueByDict(awardDict, rank)
                paramList = [rank]
                if billboardType == ShareDefine.Def_CBT_BattlefieldWJoin and enterWeekMoneyItemID:
                    moneyBaseCount, multiValue = GameWorld.GetOrderValueByDict(enterWeekMoneyMultiIntDict, rank) # 奖励货币倍值
                    #基础保底值(不同名次可能不一样) + 名次倍率*次数
                    awardMoneyCount = int(moneyBaseCount + multiValue * cmpValue)
                    awardItemList.append([enterWeekMoneyItemID, awardMoneyCount, 0])
                PlayerCompensation.SendMailByKey(mailKey, [playerID], awardItemList, paramList, crossMail=True)
            billboardObj.ClearData()
            
    return
@@ -469,13 +478,8 @@
                GameWorld.DebugLog("跨服PK赛季未开启中,跨服战场系统开启广播不处理!")
                continue
            
            notifyKey = "CrossBattlefieldOpenSys"
            paramList = [notifyOpenMinute]
            country = 0
            serverGroupIDList = []
            crossNotifyList = []
            crossNotifyList.append([ShareDefine.CrossNotify_World, [country, notifyKey, paramList]])
            PlayerControl.CrossNotifyEx(serverGroupIDList, crossNotifyList)
            serverGroupIDList = zoneIpyData.GetServerGroupIDList()
            PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOpenSys", [notifyOpenMinute])
            
        return
    
@@ -503,12 +507,7 @@
        matchTickSortList = sorted(buyPlayerInfo.values(), key=operator.attrgetter("buyTime"))
        buyRec = matchTickSortList[0]
        
        notifyKey = "CrossBattlefieldOpenPlayer"
        paramList = [buyRec.playerName, notifyOpenMinute]
        country = 0
        crossNotifyList = []
        crossNotifyList.append([ShareDefine.CrossNotify_World, [country, notifyKey, paramList]])
        PlayerControl.CrossNotifyEx(serverGroupIDList, crossNotifyList)
        PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOpenPlayer", [buyRec.playerName, notifyOpenMinute])
        
    return
@@ -669,7 +668,7 @@
    buyPlayerInfo[playerID] = buyRec
    
    # 上榜
    billboardCallCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboard", 2) # 周召集榜上榜至少次数
    billboardCallCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboard", 1) # 周召集榜上榜至少次数
    groupValue1, dataID, name1, name2 = zoneID, playerID, playerName, ""
    type2, value1, value2 = job, realmLV, 0
    cmpValue = buyOpenCountWeek + 1
@@ -758,9 +757,9 @@
    ## 跨服战场地图结算
    overTime = int(time.time())
    hmNum = GetCrossBattlefieldState()
    fbPropertyID, zoneID, funcLineID, winnerFaction, superItemInfo, superItemPlayerID, superItemPlayerName, scoreKingID, scoreKingName, battlePlayerList = msgList
    GameWorld.Log("跨服战场地图同步结果: hmNum=%s,zoneID=%s,funcLineID=%s,winnerFaction=%s,superItemInfo=%s,superItemPlayerID=%s,scoreKingID=%s,battlePlayerCount=%s"
                  % (hmNum, zoneID, funcLineID, winnerFaction, superItemInfo, superItemPlayerID, scoreKingID, len(battlePlayerList)), fbPropertyID)
    fbPropertyID, zoneID, funcLineID, winnerFaction, superItemInfo, finalSuperItemPlayerID, finalSuperItemPlayerName, superItemPlayerIDList, scoreKingID, scoreKingName, battlePlayerList = msgList
    GameWorld.Log("跨服战场地图同步结果: hmNum=%s,zoneID=%s,funcLineID=%s,winnerFaction=%s,superItemInfo=%s,finalSuperItemPlayerID=%s,superItemPlayerIDList=%s,scoreKingID=%s,battlePlayerCount=%s"
                  % (hmNum, zoneID, funcLineID, winnerFaction, superItemInfo, finalSuperItemPlayerID, superItemPlayerIDList, scoreKingID, len(battlePlayerList)), fbPropertyID)
    
    winnerOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAward", 2, {}) # 胜利方名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
    loserOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAward", 3, {}) # 失败方名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
@@ -770,17 +769,19 @@
    winnerOrderIntAwardDict = {int(k):v for k, v in winnerOrderAwardDict.items()}
    loserOrderIntAwardDict = {int(k):v for k, v in loserOrderAwardDict.items()}
    
    billboardEnterCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboard", 1) # 周参与榜上榜至少次数
    billboardEnterCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboardJoin", 1) # 周参与榜上榜至少次数
    
    syncPlayerDataInfo = {}
    winnerPlayerIDList, loserPlayerIDList = [], []
    for playerInfo in battlePlayerList:
        faction, rank, playerID, job, realmLV, name, score, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter = playerInfo
        isWinner = 0
        playerID, job, realmLV, name, \
            isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, \
            isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt, \
            factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt \
                = playerInfo
        paramList = [rank]
        if faction == winnerFaction:
            isWinner = 1
            winnerPlayerIDList.append(playerID)
            orderAwardMailKey = "CrossBattlefieldOrderWin"
            orderAwardItemList = GameWorld.GetOrderValueByDict(winnerOrderIntAwardDict, rank)
@@ -809,10 +810,12 @@
            cmpValue = highScoreWeekTotal
            CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWScore, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue)
            
        GameWorld.Log("    战场阵营玩家: faction=%s,isWinner=%s,rank=%s,playerID=%s,score=%s,highScoreToday=%s,highScoreWeekTotal=%s,enterCountWeek=%s,isCallEnter=%s"
                      % (faction, isWinner, rank, playerID, score, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter), fbPropertyID)
        GameWorld.Log("    战场阵营玩家: faction=%s,isWinner=%s,rank=%s,playerID=%s,score=%s,highScoreToday=%s,highScoreWeekTotal=%s,enterCountWeek=%s,isCallOpen=%s,isCalled=%s"
                      % (faction, isWinner, rank, playerID, score, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallOpen, isCalled), fbPropertyID)
        
        syncPlayerDataInfo[playerID] = [highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter]
        syncPlayerDataInfo[playerID] = [isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek,
                                        isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt,
                                        factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt]
        
    # 参与奖励邮件
    if winnerPlayerIDList:
@@ -822,9 +825,10 @@
    
    # 大奖获得者邮件
    superItemID, superItemCount = 0, 0
    if superItemPlayerID and superItemInfo and len(superItemInfo) == 3:
    if superItemPlayerIDList and superItemInfo and len(superItemInfo) == 3:
        superItemID, superItemCount = superItemInfo[0], superItemInfo[1]
        PlayerCompensation.SendMailByKey("CrossBattlefieldSuperAward", [superItemPlayerID], [superItemInfo], crossMail=True)
        for superItemPlayerID in superItemPlayerIDList:
            PlayerCompensation.SendMailByKey("CrossBattlefieldSuperAward", [superItemPlayerID], [superItemInfo], crossMail=True)
        
    crossZoneName = GameWorld.GetCrossZoneName()
    zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
@@ -848,7 +852,7 @@
        
    # 本分区全服:XX阵营胜利,xxx为本场积分王,xxx获得了古神大奖XXX,下个场次预计将在XX点开放。
    if battlePlayerList:
        msgParamList = [winnerFaction, scoreKingName, superItemPlayerName, superItemID, superItemCount, nextBattleTimeStr]
        msgParamList = [winnerFaction, scoreKingName, finalSuperItemPlayerName, superItemID, superItemCount, nextBattleTimeStr]
        PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOver", msgParamList)
    return
@@ -887,9 +891,8 @@
        return
    
    for playerID, playerData in syncPlayerDataInfo.items():
        highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter = playerData
        if PlayerControl.GetDBPlayerAccIDByID(playerID):
            msgInfo = ["BattlefieldOver", [overTime, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter]]
            msgInfo = ["BattlefieldOver", [overTime] + playerData]
            CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossBattlefield", msgInfo)
            
    return