From 912c7af646ef3640da22f0cf3e94a6fae02cf6ab Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 02 十二月 2024 18:49:58 +0800 Subject: [PATCH] 5559 [越南][英文][tqxbqy][砍树]优化启动检查配表格式(增加检查指定的字段格式dict、list) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py | 322 ++++++++++++++++++++++++++++++++++------------------- 1 files changed, 207 insertions(+), 115 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py index e4ca6f2..529b514 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py @@ -17,7 +17,6 @@ import datetime import PyGameData -import CrossRealmPK import CrossRealmMsg import PlayerControl import PyDataManager @@ -25,6 +24,7 @@ import CrossRealmPlayer import PlayerCompensation import PlayerViewCache +import PlayerFuncTeam import CrossBillboard import IpyGameDataPY import NetPackCommon @@ -54,6 +54,7 @@ value2:hmNum 时分场次编号 value3:playerID 购买的玩家ID value4:factionID 所选择的阵营ID +value5:serverOnly 是否仅本服玩家可加入,0-否,1-是 StrValue3:[callPlayerID,...] 召集来的玩家ID,包含自己 ''' @@ -71,6 +72,7 @@ self.zoneID = 0 self.playerID = 0 self.factionID = 0 + self.serverOnly = 0 self.callPlayerIDList = [] # 子服用,跨服服务器同步数据时负值; 不存库,玩家属性缓存信息,本服玩家取自己服务器最新缓存 @@ -88,7 +90,7 @@ "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(): @@ -112,6 +114,7 @@ hmNum = recData.GetValue2() playerID = recData.GetValue3() factionID = recData.GetValue4() + serverOnly = recData.GetValue5() strValue3 = recData.GetStrValue3() @@ -121,6 +124,7 @@ buyRec.hmNum = hmNum buyRec.playerID = playerID buyRec.factionID = factionID + buyRec.serverOnly = serverOnly buyRec.callPlayerIDList = eval(strValue3) if strValue3 else [] buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum) @@ -152,6 +156,7 @@ recData.SetValue2(buyRec.hmNum) recData.SetValue3(buyRec.playerID) recData.SetValue4(buyRec.factionID) + recData.SetValue5(buyRec.serverOnly) recData.SetStrValue3(str(buyRec.callPlayerIDList).replace(" ", "")) @@ -160,9 +165,26 @@ 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() @@ -214,14 +236,20 @@ playerID = billboardData.ID cmpValue = billboardData.CmpValue rank = i + 1 - awardItemList = GameWorld.GetOrderValueByDict(awardDict, rank, False) + 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, False) # 奖励货币倍值 + 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() @@ -256,15 +284,7 @@ ''' 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 @@ -310,6 +330,7 @@ def OnMapServerInitOK(): # 通知地图服务器状态 SyncMapServerCrossBattlefieldBuyInfo() + SyncMapServerCrossBattlefieldSysCallBuyInfo() return def SyncMapServerCrossBattlefieldBuyInfo(): @@ -324,6 +345,11 @@ buyInfo[playerID] = {"callPlayerIDList":buyRec.callPlayerIDList, "factionID":buyRec.factionID} syncMapBuyInfo[zoneID][hmNum] = buyInfo GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossBattlefieldCallTeamInfo, syncMapBuyInfo) + return + +def SyncMapServerCrossBattlefieldSysCallBuyInfo(): + syncMapBuyInfo = PyGameData.g_crossBattlefieldSysCallBuyList + GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossBattlefieldSysCallBuyInfo, syncMapBuyInfo) return def OnMinuteProcess(): @@ -416,23 +442,15 @@ PyGameData.g_crossDynamicLineInfo.pop(ChConfig.Def_FBMapID_CrossBattlefield, None) PyGameData.g_overPlayerIDList = [] + PyGameData.g_crossBattlefieldSysCallBuyList = [] - crossZoneName = GameWorld.GetCrossZoneName() - crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True) - if not crossZoneList: - crossZoneList = [] - 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: @@ -452,7 +470,12 @@ PlayerFB.OpenCrossDynamicLineBySys(zoneID, ChConfig.Def_FBMapID_CrossBattlefield, funcLineIDList, True) else: GameWorld.Log(" 无召集的场次不开分区战场! zoneID=%s" % (zoneID)) - + + # 关闭 + if not battlefieldState and beforeState != battlefieldState: + # 活动结束清空队伍 + PlayerFuncTeam.DelTeamByFunc(ChConfig.Def_FBMapID_CrossBattlefield) + # 同步子服务器 dataMsg = {"battlefieldState":battlefieldState} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_BattlefieldState, dataMsg) @@ -460,26 +483,18 @@ 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]) @@ -490,27 +505,15 @@ 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 @@ -519,17 +522,10 @@ # @return: None-当前未开放; # @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: - GameWorld.Log("赛季未开启!", playerID) - PlayerControl.NotifyCodeCross(serverGroupID, playerID, "NotifySeasonOver") return if playerID in PyGameData.g_overPlayerIDList: @@ -565,8 +561,9 @@ if passSeconds > closeSeconds: GameWorld.DebugLog("迟到了! passSeconds=%s > %s" % (passSeconds, closeSeconds), playerID) isBelate = True + #去除新队员进入不受时间限制设定 for _, copyMapObj in PyGameData.g_crossDynamicLineCopyMapInfo.items(): - if copyMapObj.IsMustCopyMapPlayer(playerID): + if copyMapObj.IsMustCopyMapPlayer(playerID, False): isBelate = False GameWorld.DebugLog("已进入的重复进入不限制时间! playerID=%s" % playerID) break @@ -639,16 +636,10 @@ 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"] # 玩家名 @@ -661,8 +652,54 @@ openHour = msgData["openHour"] openMinute = msgData["openMinute"] faction = msgData["faction"] + serverOnly = msgData.get("serverOnly", 0) + face = msgData.get("face", 0) + facePic = msgData.get("facePic", 0) hmNum = GetHMNum(openHour, openMinute) + + # 更新缓存 + curCache = PlayerViewCache.FindViewCache(playerID, True) + if curCache: + cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) + cacheDict["Name"] = playerName + cacheDict["Job"] = job + cacheDict["LV"] = playerLV + cacheDict["RealmLV"] = realmLV + cacheDict["FightPower"] = fightPower + + sysOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 1) + if [openHour, openMinute] in sysOpenHMList: + if playerID in PyGameData.g_crossBattlefieldSysCallBuyList: + GameWorld.Log("玩家已经购买过该系统场次! zoneID=%s,openHour=%s,openMinute=%s" % (zoneID, openHour, openMinute), playerID) + return + PyGameData.g_crossBattlefieldSysCallBuyList.append(playerID) + + buyTime = int(time.time()) + GameWorld.DebugLog("玩家购买系统召集场次! zoneID=%s,openHour=%s,openMinute=%s" % (zoneID, openHour, openMinute), playerID) + + # 上榜 + billboardCallCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboard", 1) # 周召集榜上榜至少次数 + groupValue1, dataID, name1, name2 = zoneID, playerID, playerName, "" + type2, value1, value2 = job, realmLV, 0 + cmpValue = buyOpenCountWeek + 1 + if cmpValue >= billboardCallCountLimit: + CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWCall, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue, value3=face, value4=facePic) + + # 通知子服 + serverGroupIDList = [serverGroupID] + msgData.update({"opType":"SysCallBuy", "buyTime":buyTime}) + sendMsg = {"zoneID":zoneID, "SysCallBuyPlayerID":playerID, "opData":msgData} + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_BattlefieldBuy, sendMsg, serverGroupIDList) + + SyncMapServerCrossBattlefieldSysCallBuyInfo() + + buyPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) + if buyPlayer: + sendCMD = str(["SysCallBuy", PyGameData.g_crossBattlefieldSysCallBuyList]) + GameWorld.GetPlayerManager().MapServer_QueryPlayer(0, 0, buyPlayer.GetPlayerID(), buyPlayer.GetRealMapID(), + "CrossBattlefield", sendCMD, len(sendCMD), buyPlayer.GetRouteServerIndex()) + return if zoneID not in PyGameData.g_crossBattlefieldBuyInfo: PyGameData.g_crossBattlefieldBuyInfo[zoneID] = {} @@ -694,16 +731,6 @@ # ================ 可以购买,以下执行添加购买场次阵营逻辑 ================ - # 更新缓存 - curCache = PlayerViewCache.FindViewCache(playerID, True) - if curCache: - cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) - cacheDict["Name"] = playerName - cacheDict["Job"] = job - cacheDict["LV"] = playerLV - cacheDict["RealmLV"] = realmLV - cacheDict["FightPower"] = fightPower - # 新增场次购买记录 buyTime = int(time.time()) buyRec = CrossBattlefieldBuy() @@ -713,9 +740,11 @@ buyRec.playerID = playerID buyRec.factionID = faction buyRec.callPlayerIDList = [playerID] + buyRec.serverOnly = serverOnly buyPlayerInfo[playerID] = buyRec - GameWorld.DebugLog("玩家购买开启召集场次! zoneID=%s,openHour=%s,openMinute=%s" % (zoneID, openHour, openMinute), playerID) + GameWorld.DebugLog("玩家购买开启召集场次! zoneID=%s,openHour=%s,openMinute=%s,faction=%s,serverOnly=%s" + % (zoneID, openHour, openMinute, faction, serverOnly), playerID) # 上榜 billboardCallCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboard", 1) # 周召集榜上榜至少次数 @@ -723,7 +752,7 @@ type2, value1, value2 = job, realmLV, 0 cmpValue = buyOpenCountWeek + 1 if cmpValue >= billboardCallCountLimit: - CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWCall, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue) + CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWCall, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue, value3=face, value4=facePic) for otherBuyPlayerID, otherRec in buyPlayerInfo.items(): if otherBuyPlayerID == playerID: @@ -749,7 +778,7 @@ tagPlayerID = msgData["tagPlayerID"] playerID = msgData["playerID"] - zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID) + zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID) if not zoneIpyData: return zoneID = zoneIpyData.GetZoneID() @@ -798,7 +827,7 @@ tagPlayerID = msgData["tagPlayerID"] playerID = msgData["playerID"] - zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID) + zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID) if not zoneIpyData: return zoneID = zoneIpyData.GetZoneID() @@ -826,6 +855,36 @@ 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()) @@ -846,8 +905,8 @@ syncPlayerDataInfo = {} winnerPlayerIDList, loserPlayerIDList = [], [] for playerInfo in battlePlayerList: - playerID, job, realmLV, name, \ - isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, \ + playerID, job, face, facePic, realmLV, name, \ + isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, teamID, \ isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt, \ factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt \ = playerInfo @@ -867,7 +926,8 @@ 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, "" @@ -875,19 +935,19 @@ enterCountWeek += 1 cmpValue = enterCountWeek if cmpValue >= billboardEnterCountLimit: - CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWJoin, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue) + CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWJoin, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue, value3=face, value4=facePic) # 更新周高分榜单 if score > highScoreToday: highScoreWeekTotal += (score - highScoreToday) highScoreToday = score cmpValue = highScoreWeekTotal - CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWScore, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue) + CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWScore, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue, value3=face, value4=facePic) - 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) + GameWorld.Log(" 战场阵营玩家: faction=%s,isWinner=%s,rank=%s,playerID=%s,score=%s,highScoreToday=%s,highScoreWeekTotal=%s,enterCountWeek=%s,teamID=%s,isCallOpen=%s,isCalled=%s" + % (faction, isWinner, rank, playerID, score, highScoreToday, highScoreWeekTotal, enterCountWeek, teamID, isCallOpen, isCalled), fbPropertyID) - syncPlayerDataInfo[playerID] = [isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, + syncPlayerDataInfo[playerID] = [isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, teamID, isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt, factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt] @@ -904,8 +964,7 @@ 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 [] # 通知子服更新参与玩家数据 @@ -937,18 +996,13 @@ 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): @@ -958,10 +1012,9 @@ 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(): @@ -975,15 +1028,26 @@ GameWorld.DebugLog("收到跨服服务器同步的战场购买信息: %s" % msgData) zoneID = msgData["zoneID"] - 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 "SysCallBuyPlayerID" in msgData: + playerID = msgData["SysCallBuyPlayerID"] + if PlayerControl.GetDBPlayerAccIDByID(playerID): + openHour = opData["openHour"] + openMinute = opData["openMinute"] + faction = opData["faction"] + buyTime = opData["buyTime"] + todayBuyOpenCount = opData["todayBuyOpenCount"] + msgInfo = ["BattlefieldBuy", [openHour, openMinute, faction, todayBuyOpenCount, buyTime]] + CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossBattlefield", msgInfo) + return + + syncBuyHMInfo = msgData["syncBuyHMInfo"] if not syncBuyHMInfo: PyGameData.g_crossBattlefieldBuyInfo.pop(zoneID, None) @@ -1024,6 +1088,9 @@ elif opType == "CallKick": pass + elif opType == "CallChange": + pass + return def SyncCrossBattlefieldBuyInfo(curPlayer, zoneID, hmNum=None): @@ -1046,6 +1113,7 @@ buyPlayerPack = ChPyNetSendPack.tagGCCrossBattlefieldBuyPlayer() buyPlayerPack.BuyPlayerID = buyPlayerID buyPlayerPack.Faction = buyRec.factionID + buyPlayerPack.ServerOnly = buyRec.serverOnly buyPlayerPack.FactionPlayerList = [] for callPlayerID in buyRec.callPlayerIDList: @@ -1113,11 +1181,9 @@ % (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) @@ -1129,6 +1195,11 @@ 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 # 请求查询跨服服务器 @@ -1172,11 +1243,9 @@ % (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) @@ -1195,3 +1264,26 @@ 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 -- Gitblit v1.8.0