10185 【越南】【港台】【主干】BOSS凭证修改(优化凭证榜单奖励结算;优化榜单备份;)
3个文件已修改
247 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_QueryBillboard.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py 188 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_QueryBillboard.py
@@ -38,7 +38,9 @@
    if billType != None:
        billBoardType = billType
    
    topNum = GameWorld.ToIntDef(gmCmdDict.get('topNum', ''), 10)
    queryCount = GameWorld.ToIntDef(gmCmdDict.get('queryCount', ''), 10)
    startRank = GameWorld.ToIntDef(gmCmdDict.get('startRank', ''), 1)
    startRank = max(1, startRank)
    
    if billBoardType == None:
        GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_TypeNumErr)
@@ -52,19 +54,22 @@
    if not billBoard:
        GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_TypeNumErr)
        return False
    billBoardInfo = []
    
    for index in range(0, billBoard.GetCount()):
        if index >= topNum:
    dataTotal = billBoard.GetCount()
    fromIndex = startRank - 1
    toIndex = fromIndex + queryCount
    billBoardInfo = []
    for index in xrange(fromIndex, toIndex):
        if index >= dataTotal:
            break
        
        billBoardData = billBoard.At(index)
        if not billBoardData:
            continue
        
        rank = index + 1
        billBoardDict = {
                        "Rank":rank,
                        "ID":billBoardData.GetID(),
                        "ID2":billBoardData.GetID2(),
                        "Name1":billBoardData.GetName1(),
@@ -91,7 +96,7 @@
        GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_MaxLimit)   
        return
    
    backMsg = {"BillBoardType":billBoardType, "BillBoardInfo":billBoardInfo}
    backMsg = {"BillBoardType":billBoardType, "BillBoardInfo":billBoardInfo, "dataTotal":dataTotal}
    #执行成功
    GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_Success, backMsg)        
    return
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBillboard.py
@@ -175,10 +175,10 @@
        drDict = {"BillboardType":self.__billboardType, "GroupValue1":self.__groupValue1, "GroupValue2":self.__groupValue2, 
                  "DataCount":len(self.__billboardList)}
        DataRecordPack.SendEventPack(eventTypeName, drDict)
        for billboardData in self.__billboardList:
        for index, billboardData in enumerate(self.__billboardList):
            dataDict = {"BillboardType":billboardData.BillboardType, "GroupValue1":billboardData.GroupValue1, 
                        "GroupValue2":billboardData.GroupValue2, "Type2":billboardData.Type2,
                        "ID":billboardData.ID, "ID2":billboardData.ID2,
                        "ID":billboardData.ID, "ID2":billboardData.ID2, "Place":index,
                        "Name1":billboardData.Name1, "Name2":billboardData.Name2,
                        "Value1":billboardData.Value1, "Value2":billboardData.Value2,
                        "Value3":billboardData.Value3, "Value4":billboardData.Value4,
@@ -318,6 +318,42 @@
            
    return
def CopyBillboardEx(fromBillboardType, toBillboardType, groupValue1, groupValue2=0):
    ## 将某个类型的榜单完全拷贝到其他榜单 - 一般用于备份、转移数据
    billboardMgr = PyDataManager.GetCrossBillboardManager()
    frbillboardObj = billboardMgr.GetCrossBillboard(fromBillboardType, groupValue1, groupValue2)
    toBillboardObj = billboardMgr.GetCrossBillboard(toBillboardType, groupValue1, groupValue2)
    toBillboardObj.ClearData()
    GameWorld.Log("CopyBillboardEx: fromBillboardType=%s,toBillboardType=%s,groupValue1=%s,groupValue2=%s"
                  % (fromBillboardType, toBillboardType, groupValue1, groupValue2))
    for frbillboardData in frbillboardObj.GetBillboardDataList():
        tobillboardData = PyGameDataStruct.tagDBCrossBillboard()
        tobillboardData.GroupValue1 = groupValue1
        tobillboardData.GroupValue2 = groupValue2
        tobillboardData.BillboardType = toBillboardType
        tobillboardData.ID = frbillboardData.ID
        tobillboardData.ID2 = frbillboardData.ID2
        tobillboardData.Name1 = frbillboardData.Name1
        tobillboardData.Name2 = frbillboardData.Name2
        tobillboardData.Type2 = frbillboardData.Type2
        tobillboardData.Value1 = frbillboardData.Value1
        tobillboardData.Value2 = frbillboardData.Value2
        tobillboardData.Value3 = frbillboardData.Value3
        tobillboardData.Value4 = frbillboardData.Value4
        tobillboardData.Value5 = frbillboardData.Value5
        tobillboardData.Value6 = frbillboardData.Value6
        tobillboardData.Value7 = frbillboardData.Value7
        tobillboardData.Value8 = frbillboardData.Value8
        tobillboardData.UserData = frbillboardData.UserData
        tobillboardData.DataLen = len(tobillboardData.UserData)
        tobillboardData.CmpValue = frbillboardData.CmpValue
        tobillboardData.CmpValue2 = frbillboardData.CmpValue2
        tobillboardData.CmpValue3 = frbillboardData.CmpValue3
        toBillboardObj.AddBillboardData(tobillboardData)
    return
#// C0 04 查看跨服排行榜 #tagCGViewCrossBillboard
#
#struct    tagCGViewCrossBillboard
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
@@ -50,10 +50,19 @@
    if not cfgID:
        return
    BillboardType = ShareDefine.Def_BT_BossTrialSubmit
    billBoard = GameWorld.GetBillboard().FindBillboard(BillboardType)
    templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex)
    __OnEndAward_Personal(templateID, BillboardType)
    DataRecordPack.DR_BillboardData(BillboardType, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex, "templateID":templateID})
    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitBak, BillboardType)
    PlayerBillboard.ClearBillboardByIndex(BillboardType)
    GameWorld.Log("=================================================================================")
    return
def __OnEndAward_Personal(templateID, billboardType):
    billBoard = GameWorld.GetBillboard().FindBillboard(billboardType)
    if not billBoard:
        return
    templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex)
    if not templateID:
        GameWorld.Log("本次活动没有个人榜奖励!")
        return
@@ -87,10 +96,6 @@
        
        PlayerCompensation.SendMailByKey("BossTrialMail10", [playerID], awardItemList, [rank])
        
    DataRecordPack.DR_BillboardData(BillboardType, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex, "templateID":templateID})
    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitBak, BillboardType)
    PlayerBillboard.ClearBillboardByIndex(BillboardType)
    GameWorld.Log("=================================================================================")
    return
def OnGiveFamilyOrderAwawrd(actNum, ipyData, dayIndex):
@@ -100,11 +105,19 @@
    if not cfgID:
        return
    BillboardType = ShareDefine.Def_BT_BossTrialSubmitFamily
    billBoard = GameWorld.GetBillboard().FindBillboard(BillboardType)
    templateID = GameWorld.GetTemplateIDByList(ipyData.GetFamilyTemplateIDList(), dayIndex)
    __OnEndAward_Family(templateID, BillboardType)
    DataRecordPack.DR_BillboardData(BillboardType, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex, "templateID":templateID})
    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitFamilyBak, BillboardType)
    PlayerBillboard.ClearBillboardByIndex(BillboardType)
    GameWorld.Log("=================================================================================")
    return
def __OnEndAward_Family(templateID, billboardType):
    billBoard = GameWorld.GetBillboard().FindBillboard(billboardType)
    if not billBoard:
        return
    templateIDList = ipyData.GetFamilyTemplateIDList()
    templateID = GameWorld.GetTemplateIDByList(templateIDList, dayIndex)
    if not templateID:
        GameWorld.Log("本次活动没有仙盟榜奖励!")
        return
@@ -140,6 +153,7 @@
        
        familyActionData = GetFamilyBossTrialSubmitActionData(familyID, False)
        if not familyActionData:
            GameWorld.ErrLog("该仙盟没有提交凭证ActionData! familyID=%s" % familyID)
            continue
        awardState = GetFamilyAwardState(familyActionData)
        awardIndex = 0 # 本服奖励状态索引
@@ -170,10 +184,6 @@
        GameWorld.Log("发放boss历练活动仙盟榜单奖励本服: familyID=%s,名次=%s,总提交个数=%s,updAwardState=%s,awardMemIDList=%s,memSubCountDict=%s" 
                      % (familyID, familyRank, cmpValue, updAwardState, awardMemIDList, memSubCountDict))
        
    DataRecordPack.DR_BillboardData(BillboardType, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex, "templateID":templateID})
    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitFamilyBak, BillboardType)
    PlayerBillboard.ClearBillboardByIndex(BillboardType)
    GameWorld.Log("=================================================================================")
    return
def MapServer_BossTrial(curPlayer, msgList):
@@ -322,6 +332,7 @@
        
        familyActionData = GetFamilyBossTrialSubmitActionData(familyID, False)
        if not familyActionData:
            GameWorld.ErrLog("该仙盟没有提交凭证ActionData! familyID=%s" % familyID)
            continue
        awardState = GetFamilyAwardState(familyActionData)
        awardIndex = 1 #跨服奖励状态索引
@@ -408,11 +419,8 @@
        PersonalTemplateID = ipyData.GetPersonalTemplateID()
        FamilyTemplateID = ipyData.GetFamilyTemplateID()
        
        if PersonalTemplateID:
            __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID)
        if FamilyTemplateID:
            __GiveCrossOrderAwardFamily(cfgID, zoneID, FamilyTemplateID)
        __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_BossTrialSubmit)
        __GiveCrossOrderAwardFamily(cfgID, zoneID, FamilyTemplateID, ShareDefine.Def_CBT_BossTrialSubmitFamily)
            
    # 如果有新活动,处理新活动
    if not state:
@@ -429,110 +437,108 @@
        
    return
    
def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID):
def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID, billboardType):
    
    groupValue1 = zoneID
    billboardType = ShareDefine.Def_CBT_BossTrialSubmit
    #billboardType = ShareDefine.Def_CBT_BossTrialSubmit #榜单类型改为参数传入,异常情况下可特殊处理用备份榜单发奖励
    billboardMgr = PyDataManager.GetCrossBillboardManager()
    billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1)
    billboardDataCount = billboardObj.GetCount()
    if not billboardDataCount:
        GameWorld.Log("跨服Boss凭证个人排行数据为空! billboardType=%s,cfgID=%s,zoneID=%s,templateID=%s" % (billboardType, cfgID, zoneID, templateID))
        GameWorld.Log("跨服Boss凭证个人排行数据为空! billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s" % (billboardType, zoneID, cfgID, templateID))
        return
    
    # 结算时排序并保存榜单数据流向
    billboardObj.SortData()
    
    GameWorld.Log("结算跨服Boss凭证个人排行奖励: billboardType=%s,cfgID=%s,zoneID=%s,templateID=%s,billboardDataCount=%s"
                  % (billboardType, cfgID, zoneID, templateID, billboardDataCount))
    GameWorld.Log("结算跨服Boss凭证个人排行奖励: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s"
                  % (billboardType, zoneID, cfgID, templateID, billboardDataCount))
    
    orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID)
    if not orderIpyDataList:
        return
    rankPre = 0
    billboardIndex = 0
    for ipyData in orderIpyDataList:
        rank = ipyData.GetRank()
        awardItemList = ipyData.GetAwardItemList()
        orderCountTotal = rank - rankPre # 奖励名次数量
        rankPre = rank
        orderCount = 0
        for index in xrange(billboardIndex, billboardDataCount):
            if orderCount >= orderCountTotal:
                break
    if orderIpyDataList:
        rankPre = 0
        billboardIndex = 0
        for ipyData in orderIpyDataList:
            rank = ipyData.GetRank()
            awardItemList = ipyData.GetAwardItemList()
            orderCountTotal = rank - rankPre # 奖励名次数量
            rankPre = rank
            orderCount = 0
            
            billboardData = billboardObj.At(index)
            playerID = billboardData.ID
            name2 = billboardData.Name2
            cmpValue = billboardData.CmpValue
            playerRank = index + 1
            GameWorld.Log("    发放boss历练个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s"
                          % (rank, playerID, cmpValue, awardItemList, name2))
            PlayerCompensation.SendMailByKey("BossTrialCrossPlayer", [playerID], awardItemList, [playerRank], crossMail=True)
            orderCount += 1
            billboardIndex += 1
            for index in xrange(billboardIndex, billboardDataCount):
                if orderCount >= orderCountTotal:
                    break
                billboardData = billboardObj.At(index)
                playerID = billboardData.ID
                name2 = billboardData.Name2
                cmpValue = billboardData.CmpValue
                playerRank = index + 1
                GameWorld.Log("    发放boss历练个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s"
                              % (rank, playerID, cmpValue, awardItemList, name2))
                PlayerCompensation.SendMailByKey("BossTrialCrossPlayer", [playerID], awardItemList, [playerRank], crossMail=True)
                orderCount += 1
                billboardIndex += 1
    # 结算完备份、清除榜单数据
    CrossBillboard.CopyBillboard(billboardType, ShareDefine.Def_CBT_BossTrialSubmitBak)
    billboardObj.ClearData()
    if billboardType == ShareDefine.Def_CBT_BossTrialSubmit:
        CrossBillboard.CopyBillboardEx(billboardType, ShareDefine.Def_CBT_BossTrialSubmitBak, groupValue1)
        billboardObj.ClearData()
    return
def __GiveCrossOrderAwardFamily(cfgID, zoneID, templateID):
def __GiveCrossOrderAwardFamily(cfgID, zoneID, templateID, billboardType):
    
    groupValue1 = zoneID
    billboardType = ShareDefine.Def_CBT_BossTrialSubmitFamily
    #billboardType = ShareDefine.Def_CBT_BossTrialSubmitFamily
    billboardMgr = PyDataManager.GetCrossBillboardManager()
    billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1)
    billboardDataCount = billboardObj.GetCount()
    if not billboardDataCount:
        GameWorld.Log("跨服Boss凭证仙盟排行数据为空! billboardType=%s,cfgID=%s,zoneID=%s,templateID=%s" % (billboardType, cfgID, zoneID, templateID))
        GameWorld.Log("跨服Boss凭证仙盟排行数据为空! billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s" % (billboardType, zoneID, cfgID, templateID))
        return
    
    # 结算时排序并保存榜单数据流向
    billboardObj.SortData()
    
    GameWorld.Log("结算跨服Boss凭证仙盟排行奖励: billboardType=%s,cfgID=%s,zoneID=%s,templateID=%s,billboardDataCount=%s"
                  % (billboardType, cfgID, zoneID, templateID, billboardDataCount))
    GameWorld.Log("结算跨服Boss凭证仙盟排行奖励: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s"
                  % (billboardType, zoneID, cfgID, templateID, billboardDataCount))
    
    orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID)
    if not orderIpyDataList:
        return
    awardFamilyList = []
    rankPre = 0
    billboardIndex = 0
    for ipyData in orderIpyDataList:
        rank = ipyData.GetRank()
        leaderAwardItemList = ipyData.GetAwardItemList()
        memAwardItemList = ipyData.GetMemAwardItemList()
        orderCountTotal = rank - rankPre # 奖励名次数量
        rankPre = rank
        orderCount = 0
    if orderIpyDataList:
        awardFamilyList = []
        rankPre = 0
        billboardIndex = 0
        for ipyData in orderIpyDataList:
            rank = ipyData.GetRank()
            leaderAwardItemList = ipyData.GetAwardItemList()
            memAwardItemList = ipyData.GetMemAwardItemList()
            orderCountTotal = rank - rankPre # 奖励名次数量
            rankPre = rank
            orderCount = 0
            for index in xrange(billboardIndex, billboardDataCount):
                if orderCount >= orderCountTotal:
                    break
                billboardData = billboardObj.At(index)
                familyID = billboardData.ID
                familySubmitTotal = billboardData.CmpValue
                familyRank = index + 1
                GameWorld.Log("    familyID=%s,名次=%s,总提交个数=%s" % (familyID, familyRank, familySubmitTotal))
                awardFamilyList.append([familyID, familyRank, familySubmitTotal, leaderAwardItemList, memAwardItemList])
                orderCount += 1
                billboardIndex += 1
        # 广播子服发放奖励
        sendMsg = {"cfgID":cfgID, "zoneID":zoneID, "templateID":templateID, "awardFamilyList":awardFamilyList}
        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossTrialFamilyAward, sendMsg)
        
        for index in xrange(billboardIndex, billboardDataCount):
            if orderCount >= orderCountTotal:
                break
            billboardData = billboardObj.At(index)
            familyID = billboardData.ID
            familySubmitTotal = billboardData.CmpValue
            familyRank = index + 1
            GameWorld.Log("    familyID=%s,名次=%s,总提交个数=%s" % (familyID, familyRank, familySubmitTotal))
            awardFamilyList.append([familyID, familyRank, familySubmitTotal, leaderAwardItemList, memAwardItemList])
            orderCount += 1
            billboardIndex += 1
    # 广播子服发放奖励
    sendMsg = {"cfgID":cfgID, "zoneID":zoneID, "templateID":templateID, "awardFamilyList":awardFamilyList}
    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossTrialFamilyAward, sendMsg)
    # 结算完备份、清除榜单数据
    CrossBillboard.CopyBillboard(billboardType, ShareDefine.Def_CBT_BossTrialSubmitFamilyBak)
    billboardObj.ClearData()
    if billboardType == ShareDefine.Def_CBT_BossTrialSubmitFamily:
        CrossBillboard.CopyBillboardEx(billboardType, ShareDefine.Def_CBT_BossTrialSubmitFamilyBak, groupValue1)
        billboardObj.ClearData()
    return