ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
@@ -18,6 +18,7 @@
import ShareDefine
import DataRecordPack
import PlayerCompensation
import PlayerDBGSEvent
import PlayerBillboard
import IpyGameDataPY
import GameWorld
@@ -29,6 +30,7 @@
def OnActStart(actNum):
    ## 活动开启
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAward % actNum, 0)
    PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_BossTrialSubmit)
    PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_BossTrialSubmitFamily)
    
@@ -43,17 +45,51 @@
def OnActEnd(actNum, ipyData, dayIndex):
    ## 活动结束
    OnGiveFamilyOrderAwawrd(actNum, ipyData, dayIndex)
    cfgID = ipyData.GetCfgID() if ipyData else 0
    # 发放排行奖励
    GameWorld.Log("=== boss历练活动结束!发放本服个人榜单奖励! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
    if not cfgID:
    GameWorld.Log("=== boss历练活动结束! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
    __OnEndAward(actNum, ipyData, dayIndex) # 兼容活动没有配置参与时间段的在活动结束补触发结算奖励
    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitFamilyBak, ShareDefine.Def_BT_BossTrialSubmitFamily)
    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitBak, ShareDefine.Def_BT_BossTrialSubmit)
    GameWorld.Log("=================================================================================")
    return
def OnActJoinEnd(actNum, ipyData, dayIndex):
    ## 活动参与结束
    __OnEndAward(actNum, ipyData, dayIndex)
    return
def __OnEndAward(actNum, ipyData, dayIndex):
    ## 结算奖励
    if not ipyData:
        return
    BillboardType = ShareDefine.Def_BT_BossTrialSubmit
    billBoard = GameWorld.GetBillboard().FindBillboard(BillboardType)
    cfgID = ipyData.GetCfgID()
    awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAward % actNum)
    if awardState:
        #已经结算过该活动
        GameWorld.Log("boss历练活动已经结算过奖励了! actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
        return
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAward % actNum, 1)
    GameWorld.Log("=== 本服boss历练活动发放榜单奖励! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
    familyTemplateID = GameWorld.GetTemplateIDByList(ipyData.GetFamilyTemplateIDList(), dayIndex)
    __OnEndAward_Family(familyTemplateID, ShareDefine.Def_BT_BossTrialSubmitFamily)
    templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex)
    __OnEndAward_Personal(templateID, ShareDefine.Def_BT_BossTrialSubmit)
    # 流向备份
    DataRecordPack.DR_BillboardData(ShareDefine.Def_BT_BossTrialSubmitFamily, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex})
    DataRecordPack.DR_BillboardData(ShareDefine.Def_BT_BossTrialSubmit, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex})
    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
@@ -65,7 +101,7 @@
    for tempIpyData in tempIpyDataList:
        rankAwardDict[tempIpyData.GetRank()] = tempIpyData.GetAwardItemList()
        
    GameWorld.Log("    templateID=%s,rankAwardDict=%s" % (templateID, rankAwardDict))
    GameWorld.Log("结算个人榜单奖励: templateID=%s,rankAwardDict=%s" % (templateID, rankAwardDict))
    billBoard.Sort()
    for index in xrange(billBoard.GetCount()):
        billBoardData = billBoard.At(index)
@@ -87,28 +123,16 @@
        
        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):
    cfgID = ipyData.GetCfgID() if ipyData else 0
    # 发放排行奖励
    GameWorld.Log("=== boss历练活动结束!发放本服仙盟榜单奖励! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
    if not cfgID:
        return
    BillboardType = ShareDefine.Def_BT_BossTrialSubmitFamily
    billBoard = GameWorld.GetBillboard().FindBillboard(BillboardType)
def __OnEndAward_Family(familyTemplateID, billboardType):
    billBoard = GameWorld.GetBillboard().FindBillboard(billboardType)
    if not billBoard:
        return
    templateIDList = ipyData.GetFamilyTemplateIDList()
    templateID = templateIDList[-1] if dayIndex >= len(templateIDList) else templateIDList[dayIndex]
    if not templateID:
    if not familyTemplateID:
        GameWorld.Log("本次活动没有仙盟榜奖励!")
        return
    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID)
    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", familyTemplateID)
    if not tempIpyDataList:
        return
    
@@ -116,7 +140,7 @@
    for tempIpyData in tempIpyDataList:
        rankAwardDict[tempIpyData.GetRank()] = [tempIpyData.GetAwardItemList(), tempIpyData.GetMemAwardItemList()]
        
    GameWorld.Log("    templateID=%s,rankAwardDict=%s" % (templateID, rankAwardDict))
    GameWorld.Log("结算仙盟榜单奖励: familyTemplateID=%s,rankAwardDict=%s" % (familyTemplateID, rankAwardDict))
    billBoard.Sort()
    
    familyManager = GameWorld.GetFamilyManager()
@@ -140,6 +164,7 @@
        
        familyActionData = GetFamilyBossTrialSubmitActionData(familyID, False)
        if not familyActionData:
            GameWorld.ErrLog("该仙盟没有提交凭证ActionData! familyID=%s" % familyID)
            continue
        awardState = GetFamilyAwardState(familyActionData)
        awardIndex = 0 # 本服奖励状态索引
@@ -170,10 +195,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 +343,7 @@
        
        familyActionData = GetFamilyBossTrialSubmitActionData(familyID, False)
        if not familyActionData:
            GameWorld.ErrLog("该仙盟没有提交凭证ActionData! familyID=%s" % familyID)
            continue
        awardState = GetFamilyAwardState(familyActionData)
        awardIndex = 1 #跨服奖励状态索引
@@ -368,7 +390,7 @@
    if not actInfo or not actInfo[ShareDefine.ActKey_State]:
        GameWorld.ErrLog("跨服boss历练非活动中,无法提交! cfgID=%s, zoneID=%s" % (cfgID, zoneID))
        return
    if not actInfo[ShareDefine.ActKey_StateJoin]:
    if actInfo[ShareDefine.ActKey_StateJoin] != ShareDefine.ActStateJoin_Start:
        GameWorld.ErrLog("跨服boss历练非可参与状态,无法提交! cfgID=%s, zoneID=%s" % (cfgID, zoneID))
        return
    ipyData = IpyGameDataPY.GetIpyGameData("CrossActBossTrial", cfgID)
@@ -396,143 +418,167 @@
        
    return
def OnCrossActIDChange(cfgID, state):
    ## 活动ID变更
    # 先结算活动
    zoneID = 0
    ipyData = IpyGameDataPY.GetIpyGameData("CrossActBossTrial", cfgID)
    if ipyData:
        zoneID = ipyData.GetZoneID()
        PersonalTemplateID = ipyData.GetPersonalTemplateID()
        FamilyTemplateID = ipyData.GetFamilyTemplateID()
        if PersonalTemplateID:
            __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID)
        if FamilyTemplateID:
            __GiveCrossOrderAwardFamily(cfgID, zoneID, FamilyTemplateID)
    # 如果有新活动,处理新活动
    if not state:
        return
    if zoneID:
        groupValue1 = zoneID
        billboardMgr = PyDataManager.GetCrossBillboardManager()
        billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmit, groupValue1)
        billboardObj.ClearData() # 新活动重置榜单数据
        billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmitFamily, groupValue1)
        billboardObj.ClearData() # 新活动重置榜单数据
    return
def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID):
    groupValue1 = zoneID
    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))
        return
    # 结算时排序并保存榜单数据流向
    billboardObj.SortData()
    GameWorld.Log("结算跨服Boss凭证个人排行奖励: billboardType=%s,cfgID=%s,zoneID=%s,templateID=%s,billboardDataCount=%s"
                  % (billboardType, cfgID, zoneID, 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
            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()
def OnCrossActIDChange(cfgID, zoneID, ipyData, state):
    ## 跨服活动ID变更
    if state:
        OnCrossActStart(cfgID, zoneID, ipyData)
    else:
        OnCrossActEnd(cfgID, zoneID, ipyData)
    return
def __GiveCrossOrderAwardFamily(cfgID, zoneID, templateID):
def OnCrossActStart(cfgID, zoneID, ipyData):
    ## 跨服活动开启
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAwardC % zoneID, 0)
    
    groupValue1 = zoneID
    billboardType = ShareDefine.Def_CBT_BossTrialSubmitFamily
    billboardMgr = PyDataManager.GetCrossBillboardManager()
    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmit, groupValue1)
    billboardObj.ClearData() # 新活动重置榜单数据
    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmitFamily, groupValue1)
    billboardObj.ClearData() # 新活动重置榜单数据
    return
def OnCrossActEnd(cfgID, zoneID, ipyData):
    ## 跨服活动结束
    groupValue1 = zoneID
    GameWorld.Log("=== 跨服boss历练活动结束! === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
    __OnCrossEndAward(cfgID, zoneID, ipyData)
    # 备份、清除榜单数据
    billboardMgr = PyDataManager.GetCrossBillboardManager()
    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmit, groupValue1)
    CrossBillboard.CopyBillboardEx(ShareDefine.Def_CBT_BossTrialSubmit, ShareDefine.Def_CBT_BossTrialSubmitBak, groupValue1)
    billboardObj.ClearData()
    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmitFamily, groupValue1)
    CrossBillboard.CopyBillboardEx(ShareDefine.Def_CBT_BossTrialSubmitFamily, ShareDefine.Def_CBT_BossTrialSubmitFamilyBak, groupValue1)
    billboardObj.ClearData()
    GameWorld.Log("=================================================================================")
    return
def OnCrossActJoinEnd(cfgID, zoneID, ipyData):
    ## 跨服活动参与结束
    __OnCrossEndAward(cfgID, zoneID, ipyData)
    return
def __OnCrossEndAward(cfgID, zoneID, ipyData):
    ## 结算跨服奖励
    awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAwardC % zoneID)
    if awardState:
        #已经结算过该活动
        GameWorld.Log("跨服boss历练活动已经结算过奖励了! cfgID=%s,zoneID=%s" % (cfgID, zoneID))
        return
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAwardC % zoneID, 1)
    GameWorld.Log("=== 跨服boss历练活动发放榜单奖励! === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
    PersonalTemplateID = ipyData.GetPersonalTemplateID()
    FamilyTemplateID = ipyData.GetFamilyTemplateID()
    __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_BossTrialSubmit)
    __GiveCrossOrderAwardFamily(cfgID, zoneID, FamilyTemplateID, ShareDefine.Def_CBT_BossTrialSubmitFamily)
    GameWorld.Log("=================================================================================")
    return
def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID, billboardType):
    groupValue1 = zoneID
    #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()
    billboardObj.SaveDRData("BossTrial", {"cfgID":cfgID, "zoneID":zoneID})
    
    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:
    if orderIpyDataList:
        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
                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
    return
def __GiveCrossOrderAwardFamily(cfgID, zoneID, templateID, billboardType):
    groupValue1 = zoneID
    #billboardType = ShareDefine.Def_CBT_BossTrialSubmitFamily
    billboardMgr = PyDataManager.GetCrossBillboardManager()
    billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1)
    billboardDataCount = billboardObj.GetCount()
    if not billboardDataCount:
        GameWorld.Log("跨服Boss凭证仙盟排行数据为空! billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s" % (billboardType, zoneID, cfgID, templateID))
        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
        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)
    # 结算时排序并保存榜单数据流向
    billboardObj.SortData()
    billboardObj.SaveDRData("BossTrial", {"cfgID":cfgID, "zoneID":zoneID})
    
    # 结算完备份、清除榜单数据
    CrossBillboard.CopyBillboard(billboardType, ShareDefine.Def_CBT_BossTrialSubmitFamilyBak)
    billboardObj.ClearData()
    GameWorld.Log("结算跨服Boss凭证仙盟排行奖励: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s"
                  % (billboardType, zoneID, cfgID, templateID, billboardDataCount))
    orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID)
    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)
    return