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