From 9e96321acfae28fe3d086c58ad858db0c6df77a2 Mon Sep 17 00:00:00 2001 From: xdh <xiefantasy@qq.com> Date: 星期三, 13 三月 2019 15:36:20 +0800 Subject: [PATCH] 6305 【后端】【2.0】日常活动修改 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py | 425 ++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 340 insertions(+), 85 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py index 9691003..040d5b8 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py @@ -57,17 +57,22 @@ import PlayerControl import ItemCommon import ShareDefine -import DataRecordPack +import PlayerFlashSale #import EventSrc import ChItem import IpyGameDataPY import PlayerRune import GameFuncComm import PlayerFairyCeremony +import PlayerNewFairyCeremony +import PlayerSpringSale import PyGameData import random import math +import time + +g_mysticalShopDict = {} #神秘商店{等级范围:[等级段,{金钱类型:库}]} #--------------------------------------------------------------------- ##开始交易 # @param curPlayer 玩家实例 @@ -190,8 +195,19 @@ ## 登录 def ShopItemOnLogin(curPlayer): + if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_SuperGift): + GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_SuperGift, 1) + isGet = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GoldGiftFirstRecord) + if isGet:#首充奖励已领取则代表超值礼包已开启过, + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SuperGiftHasOpen, 1) + + + SyncMysticalLimitShopInfo(curPlayer) SyncShopItemTodayBuyCount(curPlayer) SyncSuperGiftInfo(curPlayer) + if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopGoods % 0): + __DoMysticalShopRefresh(curPlayer, True, GameWorld.GetGameWorld().GetTick()) + SyncMysticalShopInfo(curPlayer) return ##商店物品OnDay @@ -200,24 +216,38 @@ def ShopItemOnDay(curPlayer, onEventType): if onEventType == ShareDefine.Def_OnEventType: UpdataSuperGiftTime(curPlayer, True) - SyncSuperGiftInfo(curPlayer) OSSaleOpenMail(curPlayer) refreshType = [3] + #神秘商店刷新次数重置 + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopRefreshCnt, 0) + SyncMysticalShopInfo(curPlayer) + elif onEventType == ShareDefine.Def_OnEventTypeEx: refreshType = [4] openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) - if openServerDay % 3 == 0: - refreshType = [4,7] + isMixServer = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_IsMixServer) + if isMixServer: + mixServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_MixServerDay) + if mixServerDay % 3 == 0: + refreshType.append(7) + elif openServerDay % 3 == 0: + refreshType.append(7) else: return - __ResetShopItemBuyCount(curPlayer, refreshType) + ResetShopItemBuyCount(curPlayer, refreshType) return ##商店物品OnWeek # @param curPlayer 玩家实例 # @return def ShopItemOnWeek(curPlayer, onEventType): - __ResetShopItemBuyCount(curPlayer, [onEventType]) + if onEventType == ShareDefine.Def_OnEventType: + refreshType = [1] + elif onEventType == ShareDefine.Def_OnEventTypeEx: + refreshType = [2] + else: + return + ResetShopItemBuyCount(curPlayer, refreshType) return ##商店物品OnMonth @@ -230,18 +260,29 @@ refreshType = 6 else: return - __ResetShopItemBuyCount(curPlayer, [refreshType]) + ResetShopItemBuyCount(curPlayer, [refreshType]) return -def __ResetShopItemBuyCount(curPlayer, onEventTypeList): - #重置商店物品购买次数 1:周一0点刷新 2:周一5点刷新 3:每日0点刷新 4:每日5点刷新 5每月0点 6每月5点 +def ShopItemOnCrossPKSeasonChange(curPlayer): + ## 按跨服PK赛季重置 + refreshType = 8 + ResetShopItemBuyCount(curPlayer, [refreshType]) + return + +def ResetShopItemBuyCount(curPlayer, resetTypeList): + #@param resetTypeList: 需要重置的类型列表 + #重置商店物品购买次数 1:周一0点刷新 2:周一5点刷新 3:每日0点刷新 4:每日5点刷新 5每月0点 6每月5点 7每3天5点 8每赛季 + if not resetTypeList: + # 暂定必须指定类型列表,防止终身限购的误被重置 + return + syncIndexList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for i in xrange(ipyDataMgr.GetStoreCount()): shopItem = ipyDataMgr.GetStoreByIndex(i) if not shopItem.GetLimitCnt(): continue - if shopItem.GetRefreshType() not in onEventTypeList: + if shopItem.GetRefreshType() not in resetTypeList: continue dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % shopItem.GetID() curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey) @@ -271,6 +312,177 @@ syncIndexList.append(shopItem.GetID()) if syncIndexList: SyncShopItemTodayBuyCount(curPlayer, syncIndexList, True) + return + +def MysticalLimitShopOpen(curPlayer, befLV, aftLV): + ##神秘限购开启 + ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('Store', {'ShopType':16}, True) + if not ipyDataList: + return + curTime = int(time.time()) + syncGoodsList = [] + for ipyData in ipyDataList: + limitLV = ipyData.GetLimitLV() + if befLV < limitLV and aftLV >= limitLV: + goodsID = ipyData.GetID() + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopItemStartTime % goodsID, curTime) + syncGoodsList.append(goodsID) + GameWorld.DebugLog('神秘限购商品%s 开卖'%goodsID, curPlayer.GetID()) + if syncGoodsList: + SyncMysticalLimitShopInfo(curPlayer) + return + +def SyncMysticalLimitShopInfo(curPlayer): + ##神秘限购通知 + packData = ChPyNetSendPack.tagMCMysticalShopTimeInfo() + packData.ShopTimeList = [] + ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('Store', {'ShopType':16}, True) + curTime = int(time.time()) + for ipyData in ipyDataList: + goodsID = ipyData.GetID() + startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopItemStartTime % goodsID) + if not startTime: + continue + if curTime - startTime >= ipyData.GetLimitValue(): + #超时的重置 + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopItemStartTime % goodsID, 0) + else: + goodsTime = ChPyNetSendPack.tagMCMysticalShopTime() + goodsTime.GoodsID = goodsID + goodsTime.StartTime = startTime + packData.ShopTimeList.append(goodsTime) + if not packData.ShopTimeList: + return + packData.Count = len(packData.ShopTimeList) + NetPackCommon.SendFakePack(curPlayer, packData) + return + +def CheckMysticalShopRefresh(curPlayer, tick): + ##神秘商店刷新 + createRoleTime = curPlayer.GetCreateRoleTime() + diffTime = GameWorld.GetCurrentTime() - GameWorld.GetDateTimeByStr(createRoleTime, ChConfig.TYPE_Time_Format) + pastSeconds = diffTime.days*24*60*60 + diffTime.seconds + refreshTime = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 4) + if pastSeconds % refreshTime == 0: + __DoMysticalShopRefresh(curPlayer, True, tick) + return + +#// A2 32 神秘商店刷新 #tagCMRefreshMysticalShop +#struct tagCMRefreshMysticalShop +#{ +# tagHead Head; +#}; +def OnMysticalShopRefresh(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + __DoMysticalShopRefresh(curPlayer, False, tick) + return + +def __DoMysticalShopRefresh(curPlayer, isFree, tick): + global g_mysticalShopDict #{等级范围:[等级段,{金钱类型:库}]} + + lastTime = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MysticalShopLastTime) + if lastTime and tick - lastTime < 1000: + #GameWorld.DebugLog('神秘商店刷新,过于频繁!') + return + curPlayer.SetDict(ChConfig.Def_PlayerKey_MysticalShopLastTime, tick) + if not g_mysticalShopDict: + ipyMgr= IpyGameDataPY.IPY_Data() + for i in xrange(ipyMgr.GetMysteryShopCount()): + ipyData = ipyMgr.GetMysteryShopByIndex(i) + lvRange = ipyData.GetLVRange() + goodsID = ipyData.GetGoodsID() + goodsIpyData = IpyGameDataPY.GetIpyGameData('Store', goodsID) + moneyType = goodsIpyData.GetMoneyType() + weight = goodsIpyData.GetLimitValue() + lvkey = tuple(lvRange) + if lvkey not in g_mysticalShopDict: + g_mysticalShopDict[lvkey] = [lvkey[0], {}] + weightDict = {} + if moneyType not in g_mysticalShopDict[lvkey][1]: + g_mysticalShopDict[lvkey][1][moneyType] = [] + weightDict[moneyType] = weightDict.get(moneyType, 0) + weight + g_mysticalShopDict[lvkey][1][moneyType].append([weightDict[moneyType], goodsID]) + + playerLV = curPlayer.GetLV() + curLVDan, shopDict = GameWorld.GetDictValueByRangeKey(g_mysticalShopDict, playerLV) + if not shopDict: + return + maxCnt = IpyGameDataPY.GetFuncCfg('MysteryShopGoods', 1) + goldGoodsCnt =GameWorld.GetResultByRandomList(IpyGameDataPY.GetFuncEvalCfg('MysteryShopGoods', 2)) + if not goldGoodsCnt: + return + specialGoodsID = 0 #必出的商品ID + if not isFree: + #优先道具,再仙玉 + itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) + costItemID = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 1) + costItemCntDict = IpyGameDataPY.GetFuncEvalCfg('MysteryShopRefresh', 2) + curRefreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopRefreshCnt) + cntList = [int(cnt) for cnt in costItemCntDict.keys()] + cntList.sort() + costItemCnt = costItemCntDict[str(cntList[-1])] + for cnt in cntList: + if curRefreshCnt < cnt: + costItemCnt = costItemCntDict[str(cnt)] + break + enough, indexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(costItemID, itemPack, costItemCnt) + costGold = 0 + if not enough: + costGold = lackCnt * IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 3) + if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold, ChConfig.Def_Cost_MysteryShopRefresh): + return + ItemCommon.ReduceItem(curPlayer, itemPack, indexList, costItemCnt, False, "MysteryShopRefresh") + curLVRefreshData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopLVRefreshCnt) + curLVRefreshCnt, lvDan = curLVRefreshData / 10000, curLVRefreshData % 10000 + updLVRefreshCnt = 1 if curLVDan != lvDan else curLVRefreshCnt + 1 #等级段变更,重置该等级段的刷新次数 + updLVRefreshData = min(updLVRefreshCnt * 10000+curLVDan, ChConfig.Def_UpperLimit_DWord) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopLVRefreshCnt, updLVRefreshData) + specialRefreshCfg = IpyGameDataPY.GetFuncEvalCfg('MysteryShopRefresh', 5) + if curLVDan in specialRefreshCfg and updLVRefreshCnt == specialRefreshCfg[curLVDan][0]: + specialGoodsID = specialRefreshCfg[curLVDan][1] + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopRefreshCnt, curRefreshCnt+1) + + goldGoodsCnt = min(goldGoodsCnt, maxCnt) + sliverGoodsCnt = maxCnt - goldGoodsCnt + goodsResultList = [] + if goldGoodsCnt: + goodsResultList += GameWorld.GetResultByRandomListEx(shopDict.get(IPY_GameWorld.TYPE_Price_Gold_Money, []), goldGoodsCnt, []) + if sliverGoodsCnt: + goodsResultList += GameWorld.GetResultByRandomListEx(shopDict.get(IPY_GameWorld.TYPE_Price_Silver_Money, []), sliverGoodsCnt, []) + if specialGoodsID and specialGoodsID not in goodsResultList: + goodsResultList[0] = specialGoodsID + GameWorld.DebugLog('神秘商店刷新特殊规则,等级段:%s,updLVRefreshCnt=%s,specialGoodsID=%s'%(curLVDan, updLVRefreshCnt, specialGoodsID)) + + GameWorld.DebugLog('神秘商店刷新isFree=%s,goldGoodsCnt=%s,sliverGoodsCnt=%s,goodsResultList=%s'%(isFree, goldGoodsCnt, sliverGoodsCnt, goodsResultList)) + syncIndexList = [] + for i in xrange(maxCnt): + goodsID = goodsResultList[i] if i < len(goodsResultList) else 0 + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopGoods % i, goodsID) + + dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % goodsID + curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey) + if curDayBuyCnt: + PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, 0) + syncIndexList.append(goodsID) + if syncIndexList: + SyncShopItemTodayBuyCount(curPlayer, syncIndexList, True) + #通知 + SyncMysticalShopInfo(curPlayer) + return + +def SyncMysticalShopInfo(curPlayer): + ##神秘商店通知 + packData = ChPyNetSendPack.tagMCMysticalShopInfo() + packData.RefreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopRefreshCnt) + packData.GoodsList = [] + maxCnt = IpyGameDataPY.GetFuncCfg('MysteryShopGoods', 1) + for i in xrange(maxCnt): + goodsID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopGoods % i) + goodsInfo = ChPyNetSendPack.tagMCMysticalShopGoods() + goodsInfo.GoodsID = goodsID + packData.GoodsList.append(goodsInfo) + packData.Count = len(packData.GoodsList) + NetPackCommon.SendFakePack(curPlayer, packData) return ## 回购物品 @@ -325,7 +537,10 @@ # @param tick 时间戳 # @return 返回值真, 逻辑运行成功 def BuyItem(curPlayer, tick): - + + if GameWorld.IsCrossServer(): + return + buyItemList = IPY_GameWorld.IPY_CBuyItemList() itemIndex = buyItemList.GetBuyItemIndex() if itemIndex < 0: @@ -339,19 +554,33 @@ if not ipyData: return shopType = ipyData.GetShopType() - - if ipyData.GetOperationActionShop(): + operationActionShopType = ipyData.GetOperationActionShop() + if operationActionShopType == 1: actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_SpringSale, {}) state = actInfo.get(ShareDefine.ActKey_State, 0) if not state: GameWorld.DebugLog("限时特惠非活动中!state=%s" % (state), curPlayer.GetPlayerID()) return - shopTypeList = actInfo.get(ShareDefine.ActKey_ShopTypeList, []) + shopTypeList = PlayerSpringSale.GetShopTypeList(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0), actInfo.get(ShareDefine.ActKey_WorldLV, 0)) if not shopTypeList: return actShopType = shopTypeList[-1] if state > len(shopTypeList) else shopTypeList[state - 1] if shopType != actShopType: GameWorld.DebugLog("限时特惠非活动中的商店类型!state=%s,shopType=%s,actShopType=%s,shopTypeList=%s" + % (state, shopType, actShopType, shopTypeList), curPlayer.GetPlayerID()) + return + elif operationActionShopType == 2: + actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {}) + state = actInfo.get(ShareDefine.ActKey_State, 0) + if not state: + GameWorld.DebugLog("限时抢购非活动中!state=%s" % (state), curPlayer.GetPlayerID()) + return + shopTypeList = PlayerFlashSale.GetShopTypeList(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0), state, actInfo.get(ShareDefine.ActKey_WorldLV, 0)) + if not shopTypeList: + return + actShopType = shopTypeList[0] + if shopType != actShopType: + GameWorld.DebugLog("限时抢购非活动中的商店类型!state=%s,shopType=%s,actShopType=%s,shopTypeList=%s" % (state, shopType, actShopType, shopTypeList), curPlayer.GetPlayerID()) return @@ -380,7 +609,7 @@ if limitBuyCnt == -1: GameWorld.DebugLog(" vip%s才能购买"%viplv) return - + curDayBuyCnt = 0 dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex if limitBuyCnt > 0: @@ -393,7 +622,10 @@ GameWorld.DebugLog("BuyShopItem 修正购买次数!shopType=%s,itemIndex=%s,clientBuyCount=%s,canBuyCnt=%s" % (shopType, itemIndex, clientBuyCount, canBuyCnt)) clientBuyCount = canBuyCnt - + serverLimitCnt = ipyData.GetServerLimitCnt() + if serverLimitCnt > 0: + clientBuyCount = min(serverLimitCnt, clientBuyCount) + itemID, itemCount, isBind = ipyData.GetItemID(), ipyData.GetItemCnt(), ipyData.GetIsBind() itemListEx = ipyData.GetItemListEx() priceType, itemPrice = ipyData.GetMoneyType(), ipyData.GetMoneyNum() @@ -403,10 +635,10 @@ jobItemList = ipyData.GetJobItem() totalItemList = [] if itemID: - jobItemID = __GetShopJobItem(job, itemID, jobItemList) + jobItemID = GetShopJobItem(job, itemID, jobItemList) totalItemList.append([jobItemID, itemCount * clientBuyCount, isBind]) for itemIDEx, itemCountEx, isBindEx in itemListEx: - jobItemID = __GetShopJobItem(job, itemIDEx, jobItemList) + jobItemID = GetShopJobItem(job, itemIDEx, jobItemList) totalItemList.append([jobItemID, itemCountEx * clientBuyCount, isBindEx]) #允许价钱配置0,用来免费购买 if not totalItemList: @@ -422,8 +654,8 @@ if not curItem: GameWorld.ErrLog("Store shop item error! shopType=%s,itemID=%s" % (shopType, itemID)) return - packType = ShareDefine.rptRune if curItem.GetType() == ChConfig.Def_ItemType_Rune else IPY_GameWorld.rptItem - needSpace = int(math.ceil(float(itemCnt) / curItem.GetPackCount())) + packType = ChConfig.GetItemPackType(curItem.GetType()) + needSpace = ItemControler.GetItemNeedPackCount(packType, curItem, itemCnt) needPackSpaceDict[packType] = needPackSpaceDict.get(packType, 0) + needSpace if i == 0: @@ -434,30 +666,62 @@ GameWorld.DebugLog("购买物品: shopType=%s,itemIndex=%s,clientBuyCount=%s,totalItemList=%s,mainItemID=%s,needPackSpaceDict=%s" % (shopType, itemIndex, clientBuyCount, totalItemList, mainItemID, needPackSpaceDict), curPlayer.GetPlayerID()) - + mailKey = ipyData.GetMailKey() + isLackPack = False #是否背包不足 for packType, needSpace in needPackSpaceDict.items(): if needSpace > ItemCommon.GetItemPackSpace(curPlayer, packType, needSpace): - curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrNoPlace) - PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packType]) - return + isLackPack = True + if mailKey: + break + else: + curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrNoPlace) + PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packType]) + return + sendMailKey = mailKey if isLackPack and mailKey else '' #背包不足且配置了mailKey的才发邮件 # 购买限制条件扩展 if CheckBuyItemLimitEx(curPlayer, shopType, itemIndex, mainItemID, ipyData.GetLimitValue()): GameWorld.Log("Store shop item buy limit! shopType=%s,itemIndex=%s,limitValue=%s" % (shopType, itemIndex, ipyData.GetLimitValue()), curPlayer.GetPlayerID()) return + if not PlayerControl.HaveMoney(curPlayer, priceType, itemPrice): + curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrNoMoney) + return + if serverLimitCnt > 0: #全服限购判断放到最后面,GameServer直接加次数 + if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_StoreQueryState) == 1: + #已经在查询中, 不重复查询 + GameWorld.DebugLog("全服购买次数已经在查询中, 不重复查询 itemIndex=%s" % itemIndex) + return + cmdStr = '%s' % ([itemIndex, serverLimitCnt, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey]) + GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, + "GetStoreServerBuyCnt", cmdStr, len(cmdStr)) + #设置状态查询中 + curPlayer.SetDict(ChConfig.Def_PlayerKey_StoreQueryState, 1) + return #-------------------------开始购买物品----------------------------- + DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey, ipyData) + + return + +def DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey, ipyData=None): + if not ipyData: + ipyData = IpyGameDataPY.GetIpyGameData("Store", itemIndex) + priceType, itemPrice = ipyData.GetMoneyType(), ipyData.GetMoneyNum() + itemPrice *= clientBuyCount + shopType = ipyData.GetShopType() + beforeMoney = PlayerControl.GetMoney(curPlayer, priceType) infoDict = {"TotalItemList":totalItemList, "ClientBuyCount":clientBuyCount, "ShopType":shopType, "ShopItemIndex":itemIndex, ChConfig.Def_Cost_Reason_SonKey:mainItemID} - if not PlayerControl.PayMoney(curPlayer, priceType, itemPrice, ChConfig.Def_Cost_BuyStoreItem, infoDict, clientBuyCount): - curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrNoMoney) - return + PlayerControl.PayMoney(curPlayer, priceType, itemPrice, ChConfig.Def_Cost_BuyStoreItem, infoDict, clientBuyCount) + afterMoney = PlayerControl.GetMoney(curPlayer, priceType) # 今日购买次数+1 if limitBuyCnt > 0: + dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex + curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey) PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, curDayBuyCnt + clientBuyCount) SyncShopItemTodayBuyCount(curPlayer, [itemIndex]) @@ -465,34 +729,38 @@ "ItemPrice":itemPrice, "MoneyType":priceType, "BeforeMoney":beforeMoney, "AfterMoney":afterMoney} isForceEvent = priceType not in [IPY_GameWorld.TYPE_Price_Silver_Money] - + itemControl = ItemControler.PlayerItemControler(curPlayer) for itemID, itemCount, isBind in totalItemList: - curItemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, isBind) + curItemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, False) if not curItemObj: continue userData = curItemObj.GetUserData() - packType = ShareDefine.rptRune if curItemObj.GetType() == ChConfig.Def_ItemType_Rune else IPY_GameWorld.rptItem - if not itemControl.PutInItem(packType, curItemObj, event=[ChConfig.ItemGive_BuyItem, isForceEvent, dataDict]): + if not sendMailKey: + packType = ChConfig.GetItemPackType(curItemObj.GetType()) + if not itemControl.PutInItem(packType, curItemObj, event=[ChConfig.ItemGive_BuyItem, isForceEvent, dataDict]): + curItemObj.Clear() + continue + else: curItemObj.Clear() - continue - EventShell.EventRespons_BuyItem(curPlayer, itemID, itemCount) if ipyData.GetNotifyMark() and itemID == mainItemID: PlayerControl.WorldNotify(0, ipyData.GetNotifyMark(), [curPlayer.GetName(), mainItemID, userData]) - + if sendMailKey: + PlayerControl.SendMailByKey(sendMailKey, [curPlayer.GetID()], totalItemList, detail=dataDict) #触发任务购买物品 EventShell.EventRespons_ShopBuy(curPlayer, shopType) #curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrShopOK) SyncShoppingResult(curPlayer, itemIndex, clientBuyCount) if itemIndex in IpyGameDataPY.GetFuncEvalCfg('CeremonyFireParty', 1, {}).values(): PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Fireworks, clientBuyCount) - if itemIndex in dict(IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList')): - UpdataSuperGiftTime(curPlayer) + if itemIndex in IpyGameDataPY.GetFuncEvalCfg('NewCeremonyFireParty', 1, {}).values(): + PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Fireworks, clientBuyCount) + return -def __GetShopJobItem(job, itemID, jobItemList): +def GetShopJobItem(job, itemID, jobItemList): ## 获取商城物品对应的职业物品, 职业从1开始 for jobItemIDList in jobItemList: if type(jobItemIDList) not in [list, tuple]: @@ -534,9 +802,15 @@ #烟花狂欢 if itemIndex in IpyGameDataPY.GetFuncEvalCfg('CeremonyFireParty', 1, {}).values(): return not PlayerFairyCeremony.IsCanBuyFireworks(curPlayer, itemIndex) - - if itemIndex in dict(IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList')): - return not CheckSuperGiftBuy(curPlayer, itemIndex) + if itemIndex in IpyGameDataPY.GetFuncEvalCfg('NewCeremonyFireParty', 1, {}).values(): + return not PlayerNewFairyCeremony.IsCanBuyFireworks(curPlayer, itemIndex) +# if itemIndex in dict(IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList')): +# return not CheckSuperGiftBuy(curPlayer, itemIndex) + if shopNPCID == 16:#神秘限购 + startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopItemStartTime % itemIndex) + curTime = int(time.time()) + return not startTime or curTime - startTime >= limitValue + # # limitPlusDict = {shopItem.GetLimitPlusType1():shopItem.GetLimitPlusValue1(), # shopItem.GetLimitPlusType2():shopItem.GetLimitPlusValue2(), @@ -576,67 +850,48 @@ #超值礼包购买时间 def UpdataSuperGiftTime(curPlayer, isOnday=False): - superGiftData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftData) - giftIndex, startDay = superGiftData%10, superGiftData/10 - superGiftTimeList = IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList') - if giftIndex >= len(superGiftTimeList): - return - if isOnday and not giftIndex: - return - openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)+1 - newIndex = giftIndex + curTime = int(time.time()) if isOnday: - lastDays = 0 - pastDay = openServerDay - startDay - for i in xrange(giftIndex-1, len(superGiftTimeList)): - lastDays += superGiftTimeList[i][1] - if pastDay < lastDays: - break - if pastDay >= lastDays: - newIndex = i+2 - + startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftStartTime) + if not startTime: + return + superGiftTimeList = IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList') + maxDay = max([info[1] for info in superGiftTimeList]) + if curTime - startTime >= maxDay * 86400: + #活动结束 重置 + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SuperGiftStartTime, 0) else: - newIndex = min(len(superGiftTimeList), giftIndex+1) + if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftHasOpen): + #老号已开启过超值礼包则不再开启 + return - if newIndex == giftIndex: - return - - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SuperGiftData, openServerDay*10+newIndex) - #通知 - if not isOnday: - SyncSuperGiftInfo(curPlayer) - if newIndex == 1: + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SuperGiftStartTime, curTime) addItemList = IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList', 2) PlayerControl.SendMailByKey('SellMail2', [curPlayer.GetID()], addItemList) + SyncSuperGiftInfo(curPlayer) return True def SyncSuperGiftInfo(curPlayer): - superGiftData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftData) - giftIndex, startDay = superGiftData%10, superGiftData/10 - superGiftTimeList = IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList') - if giftIndex == 0 or giftIndex > len(superGiftTimeList): + startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftStartTime) + if not startTime: return - giftID, day = superGiftTimeList[giftIndex-1] - openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)+1 - remainDay = max(0, day - openServerDay+startDay)-1 - packData = ChPyNetSendPack.tagMCSuperGiftInfo() - packData.GiftID = giftID - packData.EndtDate = str(GameWorld.GetDatetimeByDiffDays(remainDay))[:10] + packData.StartTime = startTime NetPackCommon.SendFakePack(curPlayer, packData) return def CheckSuperGiftBuy(curPlayer, giftID): #超值礼包是否可购买 - superGiftData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftData) - giftIndex, startDay = superGiftData%10, superGiftData/10 - superGiftTimeList = IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList') - if giftIndex == 0 or giftIndex > len(superGiftTimeList): + startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftStartTime) + if not startTime: return - curGiftID, day = superGiftTimeList[giftIndex-1] - if giftID != curGiftID: + + superGiftTimeDict = dict(IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList')) + totalDay = superGiftTimeDict.get(giftID, 0) + if not totalDay: return - openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)+1 - if not max(0, day - openServerDay+startDay): + curTime = int(time.time()) + if (curTime - startTime)/86400 >= totalDay: + #已结束 return return True -- Gitblit v1.8.0