| | |
| | | #
|
| | | ##@package CrossBattlefield
|
| | | #
|
| | | # @todo:跨服战场
|
| | | # @todo:跨服战场/古神战场
|
| | | # @author hxp
|
| | | # @date 2022-01-06
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 跨服战场
|
| | | # 详细描述: 跨服战场/古神战场
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2022-01-06 20:30"""
|
| | |
| | | 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()}
|
| | |
| | | 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
|
| | |
| | | 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
|
| | |
|
| | |
| | | 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
|
| | |
|
| | |
| | | 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
|
| | |
| | | ## 跨服战场地图结算
|
| | | 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,个数,是否拍品], ...], ...} , 名次配置支持段配置
|
| | |
| | | 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)
|
| | |
| | | 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:
|
| | |
| | |
|
| | | # 大奖获得者邮件
|
| | | 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)
|
| | |
| | |
|
| | | # 本分区全服: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
|
| | |
|
| | |
| | | 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
|