8650 【主干】【BT2】活动规则优化(限时礼包支持多活动编号同时开启 同步主干冲突);
1个文件已修改
135 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashGiftbag.py 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashGiftbag.py
@@ -23,9 +23,7 @@
import ChPyNetSendPack
import DataRecordPack
import ItemControler
import IPY_GameWorld
import PlayerWeekParty
import ItemCommon
import GameWorld
import ChConfig
import CommFunc
@@ -42,57 +40,105 @@
    return todayGiftbag
def OnPlayerLogin(curPlayer):
    __CheckPlayerFlashGiftbagAction(curPlayer)
    TransferPlayerActDBKeyValue(curPlayer)
    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {}).values():
        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
        isReset = __CheckPlayerFlashGiftbagAction(curPlayer, actNum)
        if not isReset:
            pass
    return
def RefreshFlashGiftbagActionInfo():
def TransferPlayerActDBKeyValue(curPlayer):
    ## 玩家登录时调用,旧版本玩家活动数据转移到新版本字典,线上版本维护之后的版本可删除此代码,线上版本分支 gt_1.100.4
    ##限时礼包活动
    Def_PDict_FlashGiftbagID = "FlashGiftbagID"  # 玩家身上的限时礼包活动ID,唯一标识,取活动开始日期time
    Def_PDict_FlashGiftbagBuyCount = "FlashGiftbagBuyCount_%s"  # 限时礼包已购买次数,参数(礼包ID)
    Def_PDict_FlashGiftbagMailState = "FlashGiftbagMailState"  # 玩家身上的活动更新提醒邮件状态
    playerActID = curPlayer.NomalDictGetProperty(Def_PDict_FlashGiftbagID)
    if not playerActID:
        return
    tagActNum = 10
    playerMailState = curPlayer.NomalDictGetProperty(Def_PDict_FlashGiftbagMailState) # 玩家身上的活动提醒邮件状态
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagID % tagActNum, playerActID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagMailState % tagActNum, playerMailState)
    PlayerControl.NomalDictSetProperty(curPlayer, Def_PDict_FlashGiftbagID, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, Def_PDict_FlashGiftbagMailState, 0)
    GameWorld.Log("限时礼包转移玩家活动字典记录: playerActID=%s,tagActNum=%s" % (playerActID, tagActNum), curPlayer.GetPlayerID())
    ipyMgr = IpyGameDataPY.IPY_Data()
    for index in xrange(ipyMgr.GetFlashGiftbagCount()):
        ipyData = ipyMgr.GetFlashGiftbagByIndex(index)
        giftbagID = ipyData.GetGiftbagID()
        buyCount = curPlayer.NomalDictGetProperty(Def_PDict_FlashGiftbagBuyCount % giftbagID)
        if buyCount <= 0:
            continue
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagBuyCount % (tagActNum, giftbagID), buyCount)
        PlayerControl.NomalDictSetProperty(curPlayer, Def_PDict_FlashGiftbagBuyCount % giftbagID, 0)
        GameWorld.Log("    转移购买次数: giftbagID=%s,buyCount=%s" % (giftbagID, buyCount), curPlayer.GetPlayerID())
    return
def RefreshFlashGiftbagActionInfo(actNum):
    ## 收到GameServer同步的活动信息,刷新活动信息
    playerManager = GameWorld.GetPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(index)
        if curPlayer.GetID() == 0:
            continue
        __CheckPlayerFlashGiftbagAction(curPlayer)
        __CheckPlayerFlashGiftbagAction(curPlayer, actNum)
    return
def __CheckPlayerFlashGiftbagAction(curPlayer):
def __CheckPlayerFlashGiftbagAction(curPlayer, actNum):
    ## 检查玩家显示礼包活动数据信息
    
    playerID = curPlayer.GetPlayerID()
    
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashGiftbag, actNum)
    actID = actInfo.get(ShareDefine.ActKey_ID, 0)
    state = actInfo.get(ShareDefine.ActKey_State, 0)
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
    
    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagID) # 玩家身上的活动ID
    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagID % actNum) # 玩家身上的活动ID
    giftbagTypeList = [] if not cfgID else GetGiftbagTypeList(cfgID, actInfo.get(ShareDefine.ActKey_DayIndex, 0), actInfo.get(ShareDefine.ActKey_WorldLV, 0))
    isReset = False
    if actID != playerActID:
        isReset = True
        __ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagID, actID)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagMailState, 0)
        GameWorld.DebugLog("限时礼包重置! actID=%s,playerActID=%s,state=%s,giftbagTypeList=%s" % (actID, playerActID, state, giftbagTypeList), playerID)
        Sync_FlashGiftbagActionInfo(curPlayer)
        __ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList, actNum)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagID % actNum, actID)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagMailState % actNum, 0)
        GameWorld.DebugLog("限时礼包重置! actNum=%s,actID=%s,playerActID=%s,state=%s,giftbagTypeList=%s"
                           % (actNum, actID, playerActID, state, giftbagTypeList), playerID)
        Sync_FlashGiftbagActionInfo(curPlayer, actNum)
    else:
        GameWorld.DebugLog("限时礼包活动ID不变,不处理!", curPlayer.GetPlayerID())
        GameWorld.DebugLog("限时礼包活动ID不变,不处理!actNum=%s,playerActID=%s" % (actNum, playerActID), curPlayer.GetPlayerID())
        
    playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagMailState) # 玩家身上的活动提醒邮件状态
    playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagMailState % actNum) # 玩家身上的活动提醒邮件状态
    if actID and state and state != playerMailState:
        flashGiftbagIpyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID)
        if flashGiftbagIpyData and flashGiftbagIpyData.GetMailKey() and curPlayer.GetLV() >= flashGiftbagIpyData.GetLVLimit():
            PlayerControl.SendMailByKey(flashGiftbagIpyData.GetMailKey(), [playerID], flashGiftbagIpyData.GetMailItemPrize())
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagMailState, state)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagMailState % actNum, state)
            GameWorld.DebugLog("    发送新限时礼包邮件提醒! state=%s,playerMailState=%s" % (state, playerMailState), playerID)
            
    if not isReset and cfgID:
        if giftbagTypeList:
            SyncFlashGiftbagBuyCount(curPlayer, giftbagTypeList=giftbagTypeList)
        Sync_FlashGiftbagActionInfo(curPlayer)
            SyncFlashGiftbagBuyCount(curPlayer, actNum, giftbagTypeList=giftbagTypeList)
        Sync_FlashGiftbagActionInfo(curPlayer, actNum)
    return isReset
def __ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList):
def __ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList, actNum):
    ##重置限时礼包限购物品次数
    syncIDList = []
    ipyDataMgr = IpyGameDataPY.IPY_Data()
@@ -102,32 +148,29 @@
            continue
        if giftbag.GetGiftbagType() not in giftbagTypeList:
            continue
        buyCntKey = ChConfig.Def_PDict_FlashGiftbagBuyCount % giftbag.GetGiftbagID()
        buyCntKey = ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftbag.GetGiftbagID())
        if curPlayer.NomalDictGetProperty(buyCntKey) <= 0:
            continue
        PlayerControl.NomalDictSetProperty(curPlayer, buyCntKey, 0)
        syncIDList.append(giftbag.GetGiftbagID())
    if syncIDList:
        SyncFlashGiftbagBuyCount(curPlayer, syncIDList)
        SyncFlashGiftbagBuyCount(curPlayer, actNum, syncIDList)
    return
def OnPlayerOrderGiftbag(curPlayer, giftbagIDList, addDRDict):
    ## 玩家订购限时礼包
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})
    if not actInfo:
        DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag action info is null!", addDRDict)
        return
    
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})
    canBuy = False
    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {}).values():
        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
    state = actInfo.get(ShareDefine.ActKey_State, 0)
    if not state:
        DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag state is 0!", addDRDict)
        return
            continue
    
    giftbagTypeList = GetGiftbagTypeList(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0), actInfo.get(ShareDefine.ActKey_WorldLV, 0))
    if not giftbagTypeList:
        DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag GiftbagTypeList is null!", addDRDict)
        return
            continue
    actGiftbagType = giftbagTypeList[-1] if state > len(giftbagTypeList) else giftbagTypeList[state - 1]
    giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("FlashGiftbag", {"GiftbagType":actGiftbagType}, True, True)
    actGiftbagIDList = []
@@ -139,22 +182,20 @@
            break
        
    if not giftbagIpyData:
        DataRecordPack.DR_CTGError(curPlayer, "OrderInfo giftbagIDList=%s can not found actGiftbagID in actGiftbagIDList=%s,actGiftbagType=%s"
                                   % (giftbagIDList, actGiftbagIDList, actGiftbagType), addDRDict)
        return
            continue
    
    giftbagID = giftbagIpyData.GetGiftbagID()
    giftItemList = __GetJobItemList(giftbagIpyData.GetGiftItemList(), curPlayer.GetJob()) 
    addDRDict.update({"giftbagID":giftbagID, "giftItemList":giftItemList})
    buyCountLimit = giftbagIpyData.GetBuyCountLimit()
    buyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % giftbagID)
        buyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftbagID))
    if buyCountLimit:
        addDRDict.update({"buyCountLimit":buyCountLimit, "buyCount":buyCount})
        if buyCount >= buyCountLimit:
            DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag Pay count limit !buyCount=%s,buyCountLimit=%s" 
                                       % (buyCount, buyCountLimit), addDRDict)
            return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagBuyCount % giftbagID, buyCount + 1)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftbagID), buyCount + 1)
    
    if giftItemList:
        ItemControler.GivePlayerItemOrMail(curPlayer, giftItemList, "", event=[ChConfig.ItemGive_CTG, True, addDRDict])
@@ -167,8 +208,18 @@
        rmb = "0" if not orderIpyData else str(orderIpyData.GetPayRMBNum()) # RMB支持小数,这里直接转str广播
        PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), rmb, giftbagIpyData.GetMainItemID()])
    
    SyncFlashGiftbagBuyCount(curPlayer, [giftbagID])
        SyncFlashGiftbagBuyCount(curPlayer, actNum, [giftbagID])
    PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_GiftBag, actGiftbagType, False)
        canBuy = True
        GameWorld.DebugLog("    购买限时礼包: actNum=%s,actGiftbagType=%s,giftbagID=%s,buyCount=%s"
                           % (actNum, actGiftbagType, giftbagID, buyCount + 1))
        break
    if not canBuy:
        DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag can not buy!", addDRDict)
        return
    return True
def __GetJobItemList(itemList, job):
@@ -180,13 +231,14 @@
            jobItemList.append([itemID[job], itemCnt, isBind])
    return jobItemList
def SyncFlashGiftbagBuyCount(curPlayer, syncIDList=[], giftbagTypeList=[]):
def SyncFlashGiftbagBuyCount(curPlayer, actNum, syncIDList=[], giftbagTypeList=[]):
    ## 通知限时礼包玩家活动信息
    giftbagBuyInfo = ChPyNetSendPack.tagMCFlashGiftbagPlayerInfo()
    giftbagBuyInfo.ActNum = actNum
    giftbagBuyInfo.BuyCountList = []
    if syncIDList:
        for giftID in syncIDList:
            buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % giftID)
            buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftID))
            buyCountInfo = ChPyNetSendPack.tagMCFlashGiftbagBuyCount()
            buyCountInfo.GiftbagID = giftID
            buyCountInfo.BuyCount = buyCnt
@@ -200,7 +252,7 @@
            if giftbagTypeList and giftbag.GetGiftbagType() not in giftbagTypeList:
                continue
            giftID = giftbag.GetGiftbagID()
            buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % giftID)
            buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftID))
            if buyCnt <= 0:
                continue
            buyCountInfo = ChPyNetSendPack.tagMCFlashGiftbagBuyCount()
@@ -211,9 +263,9 @@
    NetPackCommon.SendFakePack(curPlayer, giftbagBuyInfo)
    return
def Sync_FlashGiftbagActionInfo(curPlayer):
def Sync_FlashGiftbagActionInfo(curPlayer, actNum):
    ## 通知限时礼包活动信息
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashGiftbag, actNum)
    if not actInfo:
        return
    
@@ -244,6 +296,7 @@
    
    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
    packInfo = ChPyNetSendPack.tagMCFlashGiftbagInfo()
    packInfo.ActNum = actNum
    packInfo.StartDate = GameWorld.GetOperationActionDateStr(flashGiftbagIpyData.GetStartDate(), openServerDay)
    packInfo.EndtDate = GameWorld.GetOperationActionDateStr(flashGiftbagIpyData.GetEndDate(), openServerDay)
    packInfo.AdvanceMinutes = flashGiftbagIpyData.GetAdvanceMinutes()