From 0a38dff639e802649e094898cc4c5c01f4eea0e0 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 08 三月 2019 14:57:22 +0800
Subject: [PATCH] 6332 【后端】【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