5537 【越南】分区热更新优化需求(增加跨服分区表古神战场,古神去除与跨服PK分区关联;)
7个文件已修改
193 ■■■■■ 已修改文件
PySysDB/PySysDBG.h 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBG.h
@@ -881,6 +881,15 @@
    list        ServerGroupIDList;    //赛区服务器组ID列表
};
//跨服分区表古神战场
struct tagCrossZoneBattlefield
{
    char        _CrossZoneName;    //跨服分区名
    BYTE        _ZoneID;    //赛区ID
    list        ServerGroupIDList;    //赛区服务器组ID列表
};
//跨服分区表竞技场
struct tagCrossZonePK
PySysDB/PySysDBPY.h
@@ -2262,6 +2262,15 @@
    list        ServerGroupIDList;    //赛区服务器组ID列表
};
//跨服分区表古神战场
struct tagCrossZoneBattlefield
{
    char        _CrossZoneName;    //跨服分区名
    BYTE        _ZoneID;    //赛区ID
    list        ServerGroupIDList;    //赛区服务器组ID列表
};
//跨服分区表竞技场
struct tagCrossZonePK
ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -747,7 +747,7 @@
                         Def_FBMapID_CrossDemonKing:"CrossZonePK",
                         Def_FBMapID_CrossGrasslandLing:"CrossZonePK",
                         Def_FBMapID_CrossGrasslandXian:"CrossZonePK",
                         Def_FBMapID_CrossBattlefield:"CrossZonePK",
                         Def_FBMapID_CrossBattlefield:"CrossZoneBattlefield",
                         Def_FBMapID_CrossChampionship:"CrossZonePK",
                         }
#跨服分区对应地图配置表名 - 仅适用于固定地图及虚拟分线的跨服玩法
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py
@@ -17,7 +17,6 @@
import datetime
import PyGameData
import CrossRealmPK
import CrossRealmMsg
import PlayerControl
import PyDataManager
@@ -165,9 +164,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()
@@ -267,15 +283,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
    
@@ -427,23 +435,14 @@
        PyGameData.g_crossDynamicLineInfo.pop(ChConfig.Def_FBMapID_CrossBattlefield, None)
        
        PyGameData.g_overPlayerIDList = []
        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:
@@ -471,26 +470,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])
@@ -500,11 +491,6 @@
    curHMNum = GetHMNum(openHour, openMinute)
    
    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 not zoneIpyData:
@@ -523,17 +509,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:
@@ -643,16 +622,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"] # 玩家名
@@ -756,7 +729,7 @@
    tagPlayerID = msgData["tagPlayerID"]
    playerID = msgData["playerID"]
    
    zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
    zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
    if not zoneIpyData:
        return
    zoneID = zoneIpyData.GetZoneID()
@@ -805,7 +778,7 @@
    tagPlayerID = msgData["tagPlayerID"]
    playerID = msgData["playerID"]
    
    zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
    zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
    if not zoneIpyData:
        return
    zoneID = zoneIpyData.GetZoneID()
@@ -840,7 +813,7 @@
    serverOnly = msgData["serverOnly"]
    playerID = msgData["playerID"]
    
    zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
    zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
    if not zoneIpyData:
        return
    zoneID = zoneIpyData.GetZoneID()
@@ -942,8 +915,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 []
    
    # 通知子服更新参与玩家数据
@@ -975,18 +947,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):
@@ -996,10 +963,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():
@@ -1016,10 +982,9 @@
    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:
@@ -1155,11 +1120,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)
@@ -1219,11 +1182,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)
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -725,6 +725,12 @@
                        ("list", "ServerGroupIDList", 0),
                        ),
                "CrossZoneBattlefield":(
                        ("char", "CrossZoneName", 1),
                        ("BYTE", "ZoneID", 1),
                        ("list", "ServerGroupIDList", 0),
                        ),
                "CrossZonePK":(
                        ("char", "CrossZoneName", 1),
                        ("BYTE", "ZoneID", 1),
@@ -2053,6 +2059,17 @@
    def GetZoneID(self): return self.attrTuple[1] # 赛区ID BYTE
    def GetServerGroupIDList(self): return self.attrTuple[2] # 赛区服务器组ID列表 list
# 跨服分区表古神战场
class IPY_CrossZoneBattlefield():
    def __init__(self):
        self.attrTuple = None
        return
    def GetCrossZoneName(self): return self.attrTuple[0] # 跨服分区名 char
    def GetZoneID(self): return self.attrTuple[1] # 赛区ID BYTE
    def GetServerGroupIDList(self): return self.attrTuple[2] # 赛区服务器组ID列表 list
# 跨服分区表竞技场
class IPY_CrossZonePK():
    
@@ -2650,6 +2667,7 @@
        self.__LoadFileData("ActManyDayRecharge", onlyCheck)
        self.__LoadFileData("ActTotalRecharge", onlyCheck)
        self.__LoadFileData("CrossZoneComm", onlyCheck)
        self.__LoadFileData("CrossZoneBattlefield", onlyCheck)
        self.__LoadFileData("CrossZonePK", onlyCheck)
        self.__LoadFileData("ChampionshipTime", onlyCheck)
        self.__LoadFileData("ChampionshipRank", onlyCheck)
@@ -3328,6 +3346,13 @@
        self.CheckLoadData("CrossZoneComm")
        return self.ipyCrossZoneCommCache[index]
    def GetCrossZoneBattlefieldCount(self):
        self.CheckLoadData("CrossZoneBattlefield")
        return self.ipyCrossZoneBattlefieldLen
    def GetCrossZoneBattlefieldByIndex(self, index):
        self.CheckLoadData("CrossZoneBattlefield")
        return self.ipyCrossZoneBattlefieldCache[index]
    def GetCrossZonePKCount(self):
        self.CheckLoadData("CrossZonePK")
        return self.ipyCrossZonePKLen
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1900,7 +1900,7 @@
                         Def_FBMapID_CrossDemonKing:"CrossZonePK",
                         Def_FBMapID_CrossGrasslandLing:"CrossZonePK",
                         Def_FBMapID_CrossGrasslandXian:"CrossZonePK",
                         Def_FBMapID_CrossBattlefield:"CrossZonePK",
                         Def_FBMapID_CrossBattlefield:"CrossZoneBattlefield",
                         Def_FBMapID_CrossChampionship:"CrossZonePK",
                         Def_FBMapID_CrossFamilyFlagwar:"CrossZoneComm",
                         }
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1773,6 +1773,12 @@
                        ("list", "ServerGroupIDList", 0),
                        ),
                "CrossZoneBattlefield":(
                        ("char", "CrossZoneName", 1),
                        ("BYTE", "ZoneID", 1),
                        ("list", "ServerGroupIDList", 0),
                        ),
                "CrossZonePK":(
                        ("char", "CrossZoneName", 1),
                        ("BYTE", "ZoneID", 1),
@@ -4894,6 +4900,17 @@
    def GetZoneID(self): return self.attrTuple[1] # 赛区ID BYTE
    def GetServerGroupIDList(self): return self.attrTuple[2] # 赛区服务器组ID列表 list
# 跨服分区表古神战场
class IPY_CrossZoneBattlefield():
    def __init__(self):
        self.attrTuple = None
        return
    def GetCrossZoneName(self): return self.attrTuple[0] # 跨服分区名 char
    def GetZoneID(self): return self.attrTuple[1] # 赛区ID BYTE
    def GetServerGroupIDList(self): return self.attrTuple[2] # 赛区服务器组ID列表 list
# 跨服分区表竞技场
class IPY_CrossZonePK():
    
@@ -5973,6 +5990,7 @@
        self.__LoadFileData("CrossRealmPKDanAward", onlyCheck)
        self.__LoadFileData("CrossRealmPKOrderAward", onlyCheck)
        self.__LoadFileData("CrossZoneComm", onlyCheck)
        self.__LoadFileData("CrossZoneBattlefield", onlyCheck)
        self.__LoadFileData("CrossZonePK", onlyCheck)
        self.__LoadFileData("CrossPenglaiZoneMap", onlyCheck)
        self.__LoadFileData("CrossDemonLandZoneMap", onlyCheck)
@@ -7433,6 +7451,13 @@
        self.CheckLoadData("CrossZoneComm")
        return self.ipyCrossZoneCommCache[index]
    def GetCrossZoneBattlefieldCount(self):
        self.CheckLoadData("CrossZoneBattlefield")
        return self.ipyCrossZoneBattlefieldLen
    def GetCrossZoneBattlefieldByIndex(self, index):
        self.CheckLoadData("CrossZoneBattlefield")
        return self.ipyCrossZoneBattlefieldCache[index]
    def GetCrossZonePKCount(self):
        self.CheckLoadData("CrossZonePK")
        return self.ipyCrossZonePKLen