| | |
| | |
|
| | | import datetime
|
| | | import PyGameData
|
| | | import CrossRealmPK
|
| | | import CrossRealmMsg
|
| | | import PlayerControl
|
| | | import PyDataManager
|
| | |
| | | value2:hmNum 时分场次编号
|
| | | value3:playerID 购买的玩家ID
|
| | | value4:factionID 所选择的阵营ID
|
| | | value5:serverOnly 是否仅本服玩家可加入,0-否,1-是
|
| | |
|
| | | StrValue3:[callPlayerID,...] 召集来的玩家ID,包含自己
|
| | | '''
|
| | |
| | | self.zoneID = 0
|
| | | self.playerID = 0
|
| | | self.factionID = 0
|
| | | self.serverOnly = 0
|
| | | self.callPlayerIDList = []
|
| | |
|
| | | # 子服用,跨服服务器同步数据时负值; 不存库,玩家属性缓存信息,本服玩家取自己服务器最新缓存
|
| | |
| | | "RealmLV":cacheDict["RealmLV"], "FightPower":cacheDict["FightPower"]}
|
| | |
|
| | | return {"buyTime":self.buyTime, "hmNum":self.hmNum, "zoneID":self.zoneID, "playerID":self.playerID, "factionID":self.factionID,
|
| | | "callPlayerIDList":self.callPlayerIDList, "callPlayerDict":self.callPlayerDict}
|
| | | "serverOnly":self.serverOnly, "callPlayerIDList":self.callPlayerIDList, "callPlayerDict":self.callPlayerDict}
|
| | |
|
| | | def SetAttr(self, attrDict):
|
| | | for k, v in attrDict.items():
|
| | |
| | | hmNum = recData.GetValue2()
|
| | | playerID = recData.GetValue3()
|
| | | factionID = recData.GetValue4()
|
| | | serverOnly = recData.GetValue5()
|
| | |
|
| | | strValue3 = recData.GetStrValue3()
|
| | |
|
| | |
| | | buyRec.hmNum = hmNum
|
| | | buyRec.playerID = playerID
|
| | | buyRec.factionID = factionID
|
| | | buyRec.serverOnly = serverOnly
|
| | | buyRec.callPlayerIDList = eval(strValue3) if strValue3 else []
|
| | |
|
| | | buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum)
|
| | |
| | | recData.SetValue2(buyRec.hmNum)
|
| | | recData.SetValue3(buyRec.playerID)
|
| | | recData.SetValue4(buyRec.factionID)
|
| | | recData.SetValue5(buyRec.serverOnly)
|
| | |
|
| | | recData.SetStrValue3(str(buyRec.callPlayerIDList).replace(" ", ""))
|
| | |
|
| | |
| | | def GetHMNum(openHour, openMinute): return openHour * 100 + openMinute
|
| | | def GetHMByNum(hmNum): return hmNum / 100, hmNum % 100
|
| | |
|
| | | def GetCrossBattlefieldZoneIpyDataList(serverGroupID=0):
|
| | | ## 获取所有分区配置列表
|
| | | ipyDataList = CrossRealmPlayer.GetCrossZoneIpyDataListByServerGroupID(ChConfig.Def_FBMapID_CrossBattlefield, serverGroupID)
|
| | | if not ipyDataList:
|
| | | return []
|
| | | return ipyDataList
|
| | |
|
| | | def GetCrossBattlefieldZoneIpyData(serverGroupID):
|
| | | ## 获取服务器所属分区配置
|
| | | return CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(ChConfig.Def_FBMapID_CrossBattlefield, serverGroupID)
|
| | |
|
| | | def GetCrossBattlefieldZoneID(serverGroupID):
|
| | | ## 获取服务器所属分区ID
|
| | | zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return 0
|
| | | return zoneIpyData.GetZoneID()
|
| | |
|
| | | def OnPlayerLogin(curPlayer):
|
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | | zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
|
| | | zoneIpyData = GetCrossBattlefieldZoneIpyData(GameWorld.GetServerGroupID())
|
| | | if not zoneIpyData:
|
| | | return
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | |
| | | playerID = billboardData.ID
|
| | | cmpValue = billboardData.CmpValue
|
| | | rank = i + 1
|
| | | awardItemList = GameWorld.GetOrderValueByDict(awardDict, rank)
|
| | | awardItemList = []
|
| | | rankAwardItemList = GameWorld.GetOrderValueByDict(awardDict, rank, False, [])
|
| | | if rankAwardItemList:
|
| | | awardItemList.extend(rankAwardItemList)
|
| | | paramList = [rank]
|
| | | if billboardType == ShareDefine.Def_CBT_BattlefieldWJoin and enterWeekMoneyItemID:
|
| | | moneyBaseCount, multiValue = GameWorld.GetOrderValueByDict(enterWeekMoneyMultiIntDict, rank) # 奖励货币倍值
|
| | | moneyBaseCount, multiValue = GameWorld.GetOrderValueByDict(enterWeekMoneyMultiIntDict, rank, False, [0, 0]) # 奖励货币倍值
|
| | | #基础保底值(不同名次可能不一样) + 名次倍率*次数
|
| | | awardMoneyCount = int(moneyBaseCount + multiValue * cmpValue)
|
| | | awardItemList.append([enterWeekMoneyItemID, awardMoneyCount, 0])
|
| | | PlayerCompensation.SendMailByKey(mailKey, [playerID], awardItemList, paramList, crossMail=True)
|
| | | GameWorld.Log(" billboardType=%s,rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s" |
| | | % (billboardType, rank, playerID, cmpValue, awardItemList))
|
| | | if awardItemList:
|
| | | PlayerCompensation.SendMailByKey(mailKey, [playerID], awardItemList, paramList, crossMail=True)
|
| | |
|
| | | billboardObj.ClearData()
|
| | |
|
| | |
| | | '''
|
| | |
|
| | | GameWorld.Log("同步给子服跨服战场数据: syncServerGroupID=%s" % (serverGroupID))
|
| | | if serverGroupID:
|
| | | ipyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
|
| | | if not ipyData:
|
| | | return
|
| | | crossZoneList = [ipyData]
|
| | | else:
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | |
| | | crossZoneList = GetCrossBattlefieldZoneIpyDataList(serverGroupID)
|
| | | if not crossZoneList:
|
| | | return
|
| | |
|
| | |
| | |
|
| | | if openDateTime <= curDateTime < closeDateTime:
|
| | | battlefieldState = openHour * 100 + openMinute
|
| | | PyGameData.g_openDateTime = openDateTime
|
| | |
|
| | | stateKey = ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossBattlefield
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | |
| | | # 移除已经存在的副本线路
|
| | | PyGameData.g_crossDynamicLineInfo.pop(ChConfig.Def_FBMapID_CrossBattlefield, None)
|
| | |
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | if not crossZoneList:
|
| | | crossZoneList = []
|
| | | PyGameData.g_overPlayerIDList = []
|
| | |
|
| | | hmNum = battlefieldState
|
| | | openHour, openMinute = GetHMByNum(hmNum)
|
| | | sysOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 1)
|
| | | |
| | | |
| | | crossZoneList = GetCrossBattlefieldZoneIpyDataList()
|
| | | for zoneIpyData in crossZoneList:
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | | |
| | | seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
|
| | | if seasonState != 1:
|
| | | GameWorld.Log(" 跨服PK赛季未开启中,跨服战场不开启! zoneID=%s" % zoneID)
|
| | | continue
|
| | |
|
| | | # 系统局确保每个等级段都有一场
|
| | | if [openHour, openMinute] in sysOpenHMList:
|
| | |
| | |
|
| | | def __DoBattlefieldOpenNotify(openHour, openMinute, notifyOpenMinute):
|
| | | ''' 执行跨服战场开启广播
|
| | | 跨服PK赛季未开启状态下,跨服战场同步关闭,故也不广播
|
| | | 还要限制开服天开启
|
| | | '''
|
| | |
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | sysOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 1)
|
| | | if [openHour, openMinute] in sysOpenHMList:
|
| | |
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | crossZoneList = GetCrossBattlefieldZoneIpyDataList()
|
| | | if not crossZoneList:
|
| | | return
|
| | |
|
| | | for zoneIpyData in crossZoneList:
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | | |
| | | seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
|
| | | if seasonState != 1:
|
| | | GameWorld.DebugLog("跨服PK赛季未开启中,跨服战场系统开启广播不处理!")
|
| | | continue
|
| | |
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | | PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOpenSys", [notifyOpenMinute])
|
| | |
| | |
|
| | | for zoneID, buyHMInfo in PyGameData.g_crossBattlefieldBuyInfo.items():
|
| | |
|
| | | seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
|
| | | if seasonState != 1:
|
| | | GameWorld.DebugLog("跨服PK赛季未开启中,跨服战场玩家开启广播不处理!")
|
| | | continue
|
| | | |
| | | zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(ChConfig.Def_FBMapID_CrossBattlefield, zoneID)
|
| | | if zoneIpyData:
|
| | | if not zoneIpyData:
|
| | | continue
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | |
|
| | | if curHMNum not in buyHMInfo:
|
| | | continue
|
| | |
|
| | | buyPlayerInfo = buyHMInfo[curHMNum]
|
| | | if not buyPlayerInfo:
|
| | | continue
|
| | | |
| | | matchTickSortList = sorted(buyPlayerInfo.values(), key=operator.attrgetter("buyTime"))
|
| | | buyRec = matchTickSortList[0]
|
| | | |
| | | PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOpenPlayer", [buyRec.playerName, notifyOpenMinute])
|
| | | PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOpenSys", [notifyOpenMinute])
|
| | |
|
| | | return
|
| | |
|
| | | def GetCrossBattlefieldOpenTime(zoneID):
|
| | | def GetCrossBattlefieldOpenTime(serverGroupID, zoneID, playerID):
|
| | | ## 获取跨服战场副本当前是否开放的时间点
|
| | | # @return: None-当前未开放;
|
| | | # @return: hour, minute - 当前开放中的时间时分,可进入
|
| | | # @return: isCallBattle, openHour, openMinute - 当前开放中的时间时分,可进入
|
| | |
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | hmNum = GetCrossBattlefieldState()
|
| | | if not hmNum:
|
| | | GameWorld.Log("当前时间战场未开启!", playerID)
|
| | | PlayerControl.NotifyCodeCross(serverGroupID, playerID, "FBIsNotOpen")
|
| | | return
|
| | |
|
| | | seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
|
| | | if seasonState != 1:
|
| | | if playerID in PyGameData.g_overPlayerIDList:
|
| | | # 您已经参加过该场次,无法再进入!
|
| | | PlayerControl.NotifyCodeCross(serverGroupID, playerID, "CrossBattlefieldAlreadyJoin")
|
| | | return
|
| | |
|
| | | openHour, openMinute = GetHMByNum(hmNum)
|
| | |
| | | isCallBattle = [openHour, openMinute] not in sysOpenHMList
|
| | | if isCallBattle:
|
| | | if zoneID not in PyGameData.g_crossBattlefieldBuyInfo:
|
| | | GameWorld.DebugLog("该分区没有使用召集令! zoneID=%s" % zoneID)
|
| | | GameWorld.Log("该分区没有使用召集令! zoneID=%s" % zoneID, playerID)
|
| | | PlayerControl.NotifyCodeCross(serverGroupID, playerID, "FBIsNotOpen")
|
| | | return
|
| | | buyHMInfo = PyGameData.g_crossBattlefieldBuyInfo[zoneID]
|
| | | if hmNum not in buyHMInfo:
|
| | | GameWorld.DebugLog("该时段还未使用召集令! zoneID=%s,hmNum=%s" % (zoneID, hmNum))
|
| | | GameWorld.Log("该时段还未使用召集令! zoneID=%s,hmNum=%s" % (zoneID, hmNum), playerID)
|
| | | PlayerControl.NotifyCodeCross(serverGroupID, playerID, "FBIsNotOpen")
|
| | | return
|
| | | |
| | | # 召集场只有一条线,如果有人结算则代表已经结束了
|
| | | if PyGameData.g_overPlayerIDList:
|
| | | # 该召集场次已结算,无法进入!
|
| | | PlayerControl.NotifyCodeCross(serverGroupID, playerID, "CrossBattlefieldCallOver")
|
| | | return
|
| | | |
| | | if PyGameData.g_openDateTime:
|
| | | serverTime = GameWorld.GetServerTime()
|
| | | passSeconds = (serverTime - PyGameData.g_openDateTime).seconds
|
| | | closeEnterMinutes = IpyGameDataPY.GetFuncCfg("CrossBattlefieldOpen", 5) # 开启X分钟后不可进入,不包含已进入玩家及召集队伍中的玩家
|
| | | closeSeconds = closeEnterMinutes * 60
|
| | | if passSeconds > closeSeconds:
|
| | | GameWorld.DebugLog("迟到了! passSeconds=%s > %s" % (passSeconds, closeSeconds), playerID)
|
| | | isBelate = True
|
| | | for _, copyMapObj in PyGameData.g_crossDynamicLineCopyMapInfo.items():
|
| | | if copyMapObj.IsMustCopyMapPlayer(playerID):
|
| | | isBelate = False
|
| | | GameWorld.DebugLog("已进入的重复进入不限制时间! playerID=%s" % playerID)
|
| | | break
|
| | | |
| | | if isCallBattle:
|
| | | buyPlayerInfo = buyHMInfo[hmNum]
|
| | | for buyRec in buyPlayerInfo.values():
|
| | | if playerID in buyRec.callPlayerIDList:
|
| | | isBelate = False
|
| | | GameWorld.DebugLog("召集令成员不受人时间限制! playerID=%s" % playerID)
|
| | | break
|
| | | |
| | | if isBelate:
|
| | | PlayerControl.NotifyCodeCross(serverGroupID, playerID, "CrossBattlefieldBelate", [closeEnterMinutes])
|
| | | return
|
| | | #else:
|
| | | # GameWorld.DebugLog("没有迟到!passSeconds=%s <= %s" % (passSeconds, closeSeconds), playerID)
|
| | |
|
| | | return isCallBattle, openHour, openMinute
|
| | |
|
| | |
| | | if not GameWorld.IsCrossServer():
|
| | | return
|
| | |
|
| | | zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
|
| | | zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | | |
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
|
| | | if seasonState != 1:
|
| | | GameWorld.Log("跨服PK赛季未开启中,跨服战场也不能开启,无法购买!")
|
| | | return
|
| | |
|
| | | playerID = msgData["playerID"] # 角色ID
|
| | | playerName = msgData["playerName"] # 玩家名
|
| | |
| | | openHour = msgData["openHour"]
|
| | | openMinute = msgData["openMinute"]
|
| | | faction = msgData["faction"]
|
| | | serverOnly = msgData.get("serverOnly", 0)
|
| | |
|
| | | hmNum = GetHMNum(openHour, openMinute)
|
| | |
|
| | |
| | | return
|
| | |
|
| | | curFactionCount, othFactionCount = 0, 0
|
| | | for callPlayerID, buyRec in buyPlayerInfo.items():
|
| | | for _, buyRec in buyPlayerInfo.items():
|
| | | if buyRec.factionID == faction:
|
| | | curFactionCount += 1
|
| | | else:
|
| | | othFactionCount += 1
|
| | |
|
| | | if playerID in buyRec.callPlayerIDList:
|
| | | GameWorld.Log("玩家已经在该召集场次阵营里! zoneID=%s,openHour=%s,openMinute=%s,callPlayerID=%s,callPlayerIDList=%s" |
| | | % (zoneID, openHour, openMinute, callPlayerID, buyRec.callPlayerIDList), playerID)
|
| | | return
|
| | | # if playerID in buyRec.callPlayerIDList:
|
| | | # GameWorld.Log("玩家已经在该召集场次阵营里! zoneID=%s,openHour=%s,openMinute=%s,callPlayerID=%s,callPlayerIDList=%s" |
| | | # % (zoneID, openHour, openMinute, callPlayerID, buyRec.callPlayerIDList), playerID)
|
| | | # return
|
| | |
|
| | | if curFactionCount > othFactionCount:
|
| | | GameWorld.Log("阵营平衡限制,不可再购买该跨服战场阵营! zoneID=%s,openHour=%s,openMinute=%s,faction=%s,curFactionCount(%s) > othFactionCount(%s)"
|
| | |
| | | buyRec.playerID = playerID
|
| | | buyRec.factionID = faction
|
| | | buyRec.callPlayerIDList = [playerID]
|
| | | buyRec.serverOnly = serverOnly
|
| | | buyPlayerInfo[playerID] = buyRec
|
| | | |
| | | GameWorld.DebugLog("玩家购买开启召集场次! zoneID=%s,openHour=%s,openMinute=%s,faction=%s,serverOnly=%s" |
| | | % (zoneID, openHour, openMinute, faction, serverOnly), playerID)
|
| | |
|
| | | # 上榜
|
| | | billboardCallCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboard", 1) # 周召集榜上榜至少次数
|
| | |
| | | if cmpValue >= billboardCallCountLimit:
|
| | | CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWCall, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue)
|
| | |
|
| | | for otherBuyPlayerID, otherRec in buyPlayerInfo.items():
|
| | | if otherBuyPlayerID == playerID:
|
| | | continue
|
| | | if playerID in otherRec.callPlayerIDList:
|
| | | otherRec.callPlayerIDList.remove(playerID)
|
| | | GameWorld.DebugLog(" 从已加入的其他召集队伍移除: otherBuyPlayerID=%s,playerID=%s" % (otherBuyPlayerID, playerID), playerID)
|
| | | |
| | | SyncMapServerCrossBattlefieldBuyInfo()
|
| | |
|
| | | # 通知子服
|
| | |
| | | tagPlayerID = msgData["tagPlayerID"]
|
| | | playerID = msgData["playerID"]
|
| | |
|
| | | zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
|
| | | zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | |
|
| | | hmNum = GetHMNum(openHour, openMinute)
|
| | | buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum)
|
| | | if tagPlayerID in buyPlayerInfo:
|
| | | GameWorld.ErrLog("玩家已购买该场次召集队伍,无法加入其他召集队伍! hmNum=%s,tagPlayerID=%s in %s" % (hmNum, tagPlayerID, buyPlayerInfo.keys()), playerID)
|
| | | return
|
| | | if buyPlayerID not in buyPlayerInfo:
|
| | | GameWorld.ErrLog("跨服战场不存在该玩家的召集队伍! hmNum=%s,buyPlayerID=%s" % (hmNum, buyPlayerID), playerID)
|
| | | return
|
| | |
| | | GameWorld.ErrLog("跨服战场召集人数已满! hmNum=%s,buyPlayerID=%s,callPlayerIDList=%s" % (hmNum, buyPlayerID, buyRec.callPlayerIDList), playerID)
|
| | | return
|
| | |
|
| | | GameWorld.DebugLog("玩家加入召集队伍! zoneID=%s,openHour=%s,openMinute=%s,buyPlayerID=%s,tagPlayerID=%s" |
| | | % (zoneID, openHour, openMinute, buyPlayerID, tagPlayerID), playerID)
|
| | | |
| | | if tagPlayerID not in buyRec.callPlayerIDList:
|
| | | buyRec.callPlayerIDList.append(tagPlayerID)
|
| | |
|
| | | for otherBuyPlayerID, otherRec in buyPlayerInfo.items():
|
| | | if otherBuyPlayerID == buyPlayerID:
|
| | | continue
|
| | | if tagPlayerID in otherRec.callPlayerIDList:
|
| | | otherRec.callPlayerIDList.remove(tagPlayerID)
|
| | | GameWorld.DebugLog(" 从已加入的其他召集队伍移除: otherBuyPlayerID=%s,tagPlayerID=%s" % (otherBuyPlayerID, tagPlayerID), playerID)
|
| | | |
| | | SyncMapServerCrossBattlefieldBuyInfo()
|
| | |
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | |
| | | tagPlayerID = msgData["tagPlayerID"]
|
| | | playerID = msgData["playerID"]
|
| | |
|
| | | zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
|
| | | zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | |
| | | return
|
| | | buyRec.callPlayerIDList.remove(tagPlayerID)
|
| | |
|
| | | GameWorld.DebugLog("玩家召集队伍踢人! zoneID=%s,openHour=%s,openMinute=%s,buyPlayerID=%s,tagPlayerID=%s" |
| | | % (zoneID, openHour, openMinute, buyPlayerID, tagPlayerID), playerID)
|
| | | |
| | | SyncMapServerCrossBattlefieldBuyInfo()
|
| | |
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | |
| | | Send_CrossServerMsg_BattlefieldBuy(zoneID, serverGroupIDList, msgData)
|
| | | return
|
| | |
|
| | | def ClientServerMsg_BattlefieldCallChange(serverGroupID, msgData):
|
| | | |
| | | openHour = msgData["openHour"]
|
| | | openMinute = msgData["openMinute"]
|
| | | serverOnly = msgData["serverOnly"]
|
| | | playerID = msgData["playerID"]
|
| | | |
| | | zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | | |
| | | hmNum = GetHMNum(openHour, openMinute)
|
| | | buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum)
|
| | | if playerID not in buyPlayerInfo:
|
| | | GameWorld.ErrLog("跨服战场不存在该玩家的召集队伍! hmNum=%s,playerID=%s" % (hmNum, playerID), playerID)
|
| | | return
|
| | | buyRec = buyPlayerInfo[playerID]
|
| | | buyRec.serverOnly = 1 if serverOnly else 0
|
| | | |
| | | GameWorld.DebugLog("玩家召集队伍修改! zoneID=%s,openHour=%s,openMinute=%s,serverOnly=%s" |
| | | % (zoneID, openHour, openMinute, serverOnly), playerID)
|
| | | |
| | | #SyncMapServerCrossBattlefieldBuyInfo()
|
| | | |
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | | msgData.update({"opType":"CallChange"})
|
| | | Send_CrossServerMsg_BattlefieldBuy(zoneID, serverGroupIDList, msgData)
|
| | | return
|
| | |
|
| | | def MapServer_CrossBattlefieldOver(msgList):
|
| | | ## 跨服战场地图结算
|
| | | overTime = int(time.time())
|
| | | hmNum = GetCrossBattlefieldState()
|
| | | fbPropertyID, zoneID, funcLineID, winnerFaction, superItemInfo, finalSuperItemPlayerID, finalSuperItemPlayerName, superItemPlayerIDList, scoreKingID, scoreKingName, battlePlayerList = msgList
|
| | | hmNum, 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)
|
| | |
|
| | |
| | | factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt \
|
| | | = playerInfo
|
| | |
|
| | | PyGameData.g_overPlayerIDList.append(playerID)
|
| | | |
| | | paramList = [rank]
|
| | | if faction == winnerFaction:
|
| | | winnerPlayerIDList.append(playerID)
|
| | | orderAwardMailKey = "CrossBattlefieldOrderWin"
|
| | | orderAwardItemList = GameWorld.GetOrderValueByDict(winnerOrderIntAwardDict, rank)
|
| | | orderAwardItemList = GameWorld.GetOrderValueByDict(winnerOrderIntAwardDict, rank, False)
|
| | | GameWorld.Log(" 获胜阵营玩家: faction=%s,rank=%s,playerID=%s" % (faction, rank, playerID), fbPropertyID)
|
| | | else:
|
| | | loserPlayerIDList.append(playerID)
|
| | | orderAwardMailKey = "CrossBattlefieldOrderLose"
|
| | | orderAwardItemList = GameWorld.GetOrderValueByDict(loserOrderIntAwardDict, rank)
|
| | | orderAwardItemList = GameWorld.GetOrderValueByDict(loserOrderIntAwardDict, rank, False)
|
| | | GameWorld.Log(" 失败阵营玩家: faction=%s,rank=%s,playerID=%s" % (faction, rank, playerID), fbPropertyID)
|
| | |
|
| | | # 排名奖励邮件
|
| | | PlayerCompensation.SendMailByKey(orderAwardMailKey, [playerID], orderAwardItemList, paramList, crossMail=True)
|
| | | if orderAwardItemList:
|
| | | PlayerCompensation.SendMailByKey(orderAwardMailKey, [playerID], orderAwardItemList, paramList, crossMail=True)
|
| | |
|
| | | # 更新周参与榜单
|
| | | groupValue1, dataID, name1, name2 = zoneID, playerID, name, ""
|
| | |
| | | for superItemPlayerID in superItemPlayerIDList:
|
| | | PlayerCompensation.SendMailByKey("CrossBattlefieldSuperAward", [superItemPlayerID], [superItemInfo], crossMail=True)
|
| | |
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
|
| | | zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(ChConfig.Def_FBMapID_CrossBattlefield, zoneID)
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList() if zoneIpyData else []
|
| | |
|
| | | # 通知子服更新参与玩家数据
|
| | |
| | | nextBattleTimeStr = "%02d:%02d" % (nextOpenHour, nextOpenMinute)
|
| | |
|
| | | # 本分区全服:XX阵营胜利,xxx为本场积分王,xxx获得了古神大奖XXX,下个场次预计将在XX点开放。
|
| | | if battlePlayerList:
|
| | | if finalSuperItemPlayerName:
|
| | | msgParamList = [winnerFaction, scoreKingName, finalSuperItemPlayerName, superItemID, superItemCount, nextBattleTimeStr]
|
| | | PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOver", msgParamList)
|
| | | return
|
| | |
| | |
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | |
|
| | | seasonState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState)
|
| | | beforeState = GetCrossBattlefieldState()
|
| | | beforeState = beforeState if (beforeState and seasonState == 1) else 0
|
| | |
|
| | | realBattlefieldState = battlefieldState if (battlefieldState and seasonState == 1) else 0
|
| | | |
| | | GameWorld.DebugLog("收到跨服服务器同步的战场状态: battlefieldState=%s,seasonState=%s,beforeState=%s,realBattlefieldState=%s" |
| | | % (battlefieldState, seasonState, beforeState, realBattlefieldState))
|
| | | GameWorld.DebugLog("收到跨服服务器同步的战场状态: battlefieldState=%s,beforeState=%s" % (battlefieldState, beforeState))
|
| | |
|
| | | key = ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossBattlefield
|
| | | gameWorld.SetDict(key, realBattlefieldState)
|
| | | GameWorld.SendMapServerMsgEx(key, realBattlefieldState)
|
| | | gameWorld.SetDict(key, battlefieldState)
|
| | | GameWorld.SendMapServerMsgEx(key, battlefieldState)
|
| | | return
|
| | |
|
| | | def CrossServerMsg_BattlefieldOver(msgData):
|
| | |
| | | overTime = msgData["overTime"]
|
| | | syncPlayerDataInfo = msgData["syncPlayerDataInfo"]
|
| | |
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | pkZoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
|
| | | if zoneID != pkZoneID:
|
| | | GameWorld.ErrLog("非本服所属分区的跨服战场购买信息! pkZoneID(%s) != zoneID(%s) %s" % (pkZoneID, zoneID, str(msgData)))
|
| | | curZoneID = GetCrossBattlefieldZoneID(GameWorld.GetServerGroupID())
|
| | | if zoneID != curZoneID:
|
| | | GameWorld.ErrLog("非本服所属分区的跨服战场购买信息! curZoneID(%s) != zoneID(%s) %s" % (curZoneID, zoneID, str(msgData)))
|
| | | return
|
| | |
|
| | | for playerID, playerData in syncPlayerDataInfo.items():
|
| | | if PlayerControl.GetDBPlayerAccIDByID(playerID):
|
| | | msgInfo = ["BattlefieldOver", [overTime] + playerData]
|
| | | CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossBattlefield", msgInfo)
|
| | | CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossBattlefield", msgInfo, True)
|
| | |
|
| | | return
|
| | |
|
| | |
| | | syncBuyHMInfo = msgData["syncBuyHMInfo"]
|
| | | opData = msgData.get("opData", {})
|
| | |
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | pkZoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
|
| | | if zoneID != pkZoneID:
|
| | | GameWorld.ErrLog("非本服所属分区的跨服战场购买信息! pkZoneID(%s) != zoneID(%s) %s" % (pkZoneID, zoneID, str(msgData)))
|
| | | curZoneID = GetCrossBattlefieldZoneID(GameWorld.GetServerGroupID())
|
| | | if zoneID != curZoneID:
|
| | | GameWorld.ErrLog("非本服所属分区的跨服战场购买信息! curZoneID(%s) != zoneID(%s) %s" % (curZoneID, zoneID, str(msgData)))
|
| | | return
|
| | |
|
| | | if not syncBuyHMInfo:
|
| | |
| | | elif opType == "CallKick":
|
| | | pass
|
| | |
|
| | | elif opType == "CallChange":
|
| | | pass
|
| | | |
| | | return
|
| | |
|
| | | def SyncCrossBattlefieldBuyInfo(curPlayer, zoneID, hmNum=None):
|
| | |
| | | buyPlayerPack = ChPyNetSendPack.tagGCCrossBattlefieldBuyPlayer()
|
| | | buyPlayerPack.BuyPlayerID = buyPlayerID
|
| | | buyPlayerPack.Faction = buyRec.factionID
|
| | | buyPlayerPack.ServerOnly = buyRec.serverOnly
|
| | | buyPlayerPack.FactionPlayerList = []
|
| | |
|
| | | for callPlayerID in buyRec.callPlayerIDList:
|
| | |
| | | % (openHour, openMinute, crossServerDateTime, endBuyDateTime), playerID)
|
| | | return
|
| | |
|
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | | zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | zoneID = GetCrossBattlefieldZoneID(GameWorld.GetServerGroupID())
|
| | | if not zoneID:
|
| | | return
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | |
|
| | | hmNum = GetHMNum(openHour, openMinute)
|
| | | buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum)
|
| | |
| | | callTeamMemMax = IpyGameDataPY.GetFuncCfg("CrossBattlefieldCall", 1)
|
| | | if len(buyRec.callPlayerIDList) >= callTeamMemMax:
|
| | | GameWorld.DebugLog("召集人数已满! hmNum=%s,buyPlayerID=%s,callPlayerIDList=%s" % (hmNum, buyPlayerID, buyRec.callPlayerIDList), playerID)
|
| | | return
|
| | | |
| | | if buyRec.serverOnly and not PlayerControl.GetDBPlayerAccIDByID(buyPlayerID):
|
| | | PlayerControl.NotifyCode(curPlayer, "CrossBattlefieldCallServerOnly")
|
| | | #GameWorld.DebugLog("非本服玩家,无法加入其购买的召集队伍! hmNum=%s,buyPlayerID=%s,serverOnly=%s" % (hmNum, buyPlayerID, buyRec.serverOnly), playerID)
|
| | | return
|
| | |
|
| | | # 请求查询跨服服务器
|
| | |
| | | openMinute = clientData.Minute
|
| | | tagPlayerID = clientData.TagPlayerID
|
| | | buyPlayerID = playerID
|
| | | |
| | | GameWorld.DebugLog("召集场次踢人: tagPlayerID=%s,openHour=%s,openMinute=%s" % (tagPlayerID, openHour, openMinute), playerID)
|
| | | if buyPlayerID == tagPlayerID:
|
| | | return
|
| | |
|
| | |
| | | % (openHour, openMinute, crossServerDateTime, endBuyDateTime), playerID)
|
| | | return
|
| | |
|
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | | zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | zoneID = GetCrossBattlefieldZoneID(GameWorld.GetServerGroupID())
|
| | | if not zoneID:
|
| | | return
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | |
|
| | | hmNum = GetHMNum(openHour, openMinute)
|
| | | buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum)
|
| | |
| | | CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_BattlefieldCallKick, dataMsg)
|
| | | return
|
| | |
|
| | | #// C0 09 跨服战场召集场次修改 #tagCGCrossBattlefieldCallChange
|
| | | #
|
| | | #struct tagCGCrossBattlefieldCallChange
|
| | | #{
|
| | | # tagHead Head;
|
| | | # BYTE Hour; //战场开启时
|
| | | # BYTE Minute; //战场开启分
|
| | | # BYTE ServerOnly; //是否仅本服玩家可加入,0-否,1-是
|
| | | #};
|
| | | def OnCrossBattlefieldCallChange(index, clientData, tick):
|
| | | if GameWorld.IsCrossServer():
|
| | | return
|
| | | |
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | openHour = clientData.Hour
|
| | | openMinute = clientData.Minute
|
| | | serverOnly = clientData.ServerOnly
|
| | | |
| | | # 请求查询跨服服务器
|
| | | dataMsg = {"openHour":openHour, "openMinute":openMinute, "serverOnly":serverOnly, "playerID":playerID}
|
| | | CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_BattlefieldCallChange, dataMsg)
|
| | | return
|