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