From 3cccf71d1f55e891a03b957bb12f633f951688e7 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 08 三月 2021 18:14:41 +0800
Subject: [PATCH] 8650 【主干】【BT2】活动规则优化(限时礼包支持多活动编号同时开启 同步主干冲突);

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashGiftbag.py |  209 ++++++++++++++++++++++++++++++++-------------------
 1 files changed, 131 insertions(+), 78 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashGiftbag.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashGiftbag.py
index 40f701b..12d19fa 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashGiftbag.py
+++ b/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,73 +148,78 @@
             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, {})
-    state = actInfo.get(ShareDefine.ActKey_State, 0)
-    if not state:
-        DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag state is 0!", addDRDict)
-        return
-    
-    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
-    actGiftbagType = giftbagTypeList[-1] if state > len(giftbagTypeList) else giftbagTypeList[state - 1]
-    giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("FlashGiftbag", {"GiftbagType":actGiftbagType}, True, True)
-    actGiftbagIDList = []
-    giftbagIpyData = None
-    for ipyData in giftbagIpyDataList:
-        actGiftbagIDList.append(ipyData.GetGiftbagID())
-        if ipyData.GetGiftbagID() in giftbagIDList:
-            giftbagIpyData = ipyData
-            break
+    canBuy = False
+    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {}).values():
+        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
         
-    if not giftbagIpyData:
-        DataRecordPack.DR_CTGError(curPlayer, "OrderInfo giftbagIDList=%s can not found actGiftbagID in actGiftbagIDList=%s,actGiftbagType=%s" 
-                                   % (giftbagIDList, actGiftbagIDList, actGiftbagType), addDRDict)
+        state = actInfo.get(ShareDefine.ActKey_State, 0)
+        if not state:
+            continue
+        
+        giftbagTypeList = GetGiftbagTypeList(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0), actInfo.get(ShareDefine.ActKey_WorldLV, 0))
+        if not giftbagTypeList:
+            continue
+        actGiftbagType = giftbagTypeList[-1] if state > len(giftbagTypeList) else giftbagTypeList[state - 1]
+        giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("FlashGiftbag", {"GiftbagType":actGiftbagType}, True, True)
+        actGiftbagIDList = []
+        giftbagIpyData = None
+        for ipyData in giftbagIpyDataList:
+            actGiftbagIDList.append(ipyData.GetGiftbagID())
+            if ipyData.GetGiftbagID() in giftbagIDList:
+                giftbagIpyData = ipyData
+                break
+            
+        if not giftbagIpyData:
+            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 % (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 % (actNum, giftbagID), buyCount + 1)
+        
+        if giftItemList:
+            ItemControler.GivePlayerItemOrMail(curPlayer, giftItemList, "", event=[ChConfig.ItemGive_CTG, True, addDRDict])
+        
+        # 取玩家APPID,混服使用
+        appID = GameWorld.GetPlayerPlatform(curPlayer)
+        notifyKey = giftbagIpyData.GetNotifyKey()
+        if notifyKey:
+            orderIpyData = GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID)
+            rmb = "0" if not orderIpyData else str(orderIpyData.GetPayRMBNum()) # RMB支持小数,这里直接转str广播
+            PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), rmb, giftbagIpyData.GetMainItemID()])
+        
+        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
     
-    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)
-    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)
-    
-    if giftItemList:
-        ItemControler.GivePlayerItemOrMail(curPlayer, giftItemList, "", event=[ChConfig.ItemGive_CTG, True, addDRDict])
-    
-    # 取玩家APPID,混服使用
-    appID = GameWorld.GetPlayerPlatform(curPlayer)
-    notifyKey = giftbagIpyData.GetNotifyKey()
-    if notifyKey:
-        orderIpyData = GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID)
-        rmb = "0" if not orderIpyData else str(orderIpyData.GetPayRMBNum()) # RMB支持小数,这里直接转str广播
-        PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), rmb, giftbagIpyData.GetMainItemID()])
-    
-    SyncFlashGiftbagBuyCount(curPlayer, [giftbagID])
-    PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_GiftBag, actGiftbagType, False)
     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()

--
Gitblit v1.8.0