4075 增加商城全服购买次数封包,商城支持背包不足发邮件
| | |
| | | DWORD MoneyOriginal; //原价
|
| | | DWORD LimitValue; //限制条件
|
| | | char NotifyMark; //广播提示
|
| | | char MailKey; //背包不足时邮件KEY
|
| | | };
|
| | |
|
| | | //限时特惠表
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A9 06 商城全服购买次数通知 #tagGCStoreServerBuyCntInfo
|
| | |
|
| | | class tagGCStoreServerBuyCnt(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("GoodsID", c_int), #商品标识
|
| | | ("BuyCnt", c_int), #购买次数
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | | self.Clear()
|
| | | memmove(addressof(self), stringData[_pos:], self.GetLength())
|
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.GoodsID = 0
|
| | | self.BuyCnt = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagGCStoreServerBuyCnt)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// A9 06 商城全服购买次数通知 //tagGCStoreServerBuyCntInfo:
|
| | | GoodsID:%d,
|
| | | BuyCnt:%d
|
| | | '''\
|
| | | %(
|
| | | self.GoodsID,
|
| | | self.BuyCnt
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagGCStoreServerBuyCntInfo(Structure):
|
| | | Head = tagHead()
|
| | | Count = 0 #(WORD Count)//数量
|
| | | InfoList = list() #(vector<tagGCStoreServerBuyCnt> InfoList)//次数信息
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA9
|
| | | self.Head.SubCmd = 0x06
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | for i in range(self.Count):
|
| | | temInfoList = tagGCStoreServerBuyCnt()
|
| | | _pos = temInfoList.ReadData(_lpData, _pos)
|
| | | self.InfoList.append(temInfoList)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA9
|
| | | self.Head.SubCmd = 0x06
|
| | | self.Count = 0
|
| | | self.InfoList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 2
|
| | | for i in range(self.Count):
|
| | | length += self.InfoList[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteWORD(data, self.Count)
|
| | | for i in range(self.Count):
|
| | | data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | Count:%d,
|
| | | InfoList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.Count,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagGCStoreServerBuyCntInfo=tagGCStoreServerBuyCntInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCStoreServerBuyCntInfo.Head.Cmd,m_NAtagGCStoreServerBuyCntInfo.Head.SubCmd))] = m_NAtagGCStoreServerBuyCntInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #A9 21 角色改名结果 #tagUpdatePlayerNameResult
|
| | |
|
| | | class tagUpdatePlayerNameResult(Structure):
|
| | |
| | | """Version = 2018-10-09 17:00"""
|
| | |
|
| | | import GameWorld
|
| | | import PlayerUniversalGameRec
|
| | | import ShareDefine
|
| | | import PlayerControl
|
| | | import IpyGameDataPY
|
| | | import ChPyNetSendPack
|
| | | import NetPackCommon
|
| | |
|
| | | RecType = ShareDefine.Def_UniversalGameRecType_StoreServerCntRecord
|
| | |
|
| | |
| | | # @param None
|
| | | # @return None
|
| | | def OnPlayerLogin(curPlayer):
|
| | | PlayerUniversalGameRec.SendUniversalGameRecInfo(curPlayer, RecType)
|
| | | SyncStoreServerBuyInfo(curPlayer)
|
| | | return
|
| | |
|
| | |
|
| | |
| | | if not findRecData:
|
| | | findRecData = recTypeListData.AddRec()
|
| | | findRecData.SetValue1(goodsID)
|
| | | findRecData.SetValue2(curGotCnt+buyCount)
|
| | | newBuyCnt = curGotCnt+buyCount
|
| | | findRecData.SetValue2(newBuyCnt)
|
| | | #֪ͨ
|
| | | playerManager = GameWorld.GetPlayerManager()
|
| | | for i in xrange(playerManager.GetActivePlayerCount()):
|
| | | curPlayer = playerManager.GetActivePlayerAt(i)
|
| | | if curPlayer == None or not curPlayer.GetInitOK():
|
| | | continue
|
| | | if PlayerControl.GetIsTJG(curPlayer):
|
| | | continue
|
| | | PlayerUniversalGameRec.SendUniversalGameRecSingle(curPlayer, findRecData)
|
| | | |
| | | SyncStoreServerBuyInfo(None, {goodsID:newBuyCnt})
|
| | | return msgList
|
| | |
|
| | | def DoResetStoreServerBuyCnt(shopTypeList):
|
| | |
| | | recTypeListData = universalRecMgr.GetTypeList(RecType)
|
| | |
|
| | | delCnt = 0
|
| | | syncDict = {}
|
| | | for index in xrange(recTypeListData.Count()):
|
| | | dataIndex = index - delCnt
|
| | | recData = recTypeListData.At(dataIndex)
|
| | |
| | | continue
|
| | | if ipyData.GetShopType() not in shopTypeList:
|
| | | continue
|
| | | syncDict[curGoodsID] = 0
|
| | | recTypeListData.Delete(dataIndex)
|
| | | delCnt +=1
|
| | | |
| | | GameWorld.DebugLog(' 根据商店类型重置全服购买次数 shopTypeList=%s'%shopTypeList)
|
| | | if delCnt:
|
| | | PlayerUniversalGameRec.SendUniversalGameRecInfo(None, RecType)
|
| | | SyncStoreServerBuyInfo(None, syncDict)
|
| | | |
| | | return
|
| | |
|
| | |
|
| | |
| | | shopType = dayShopList[state-1] if state-1 < len(dayShopList) else dayShopList[-1]
|
| | | DoResetStoreServerBuyCnt([shopType])
|
| | | return |
| | |
|
| | | def SyncStoreServerBuyInfo(curPlayer, syncCntDict={}):
|
| | | #通知商品全服购买次数
|
| | | sendPack = ChPyNetSendPack.tagGCStoreServerBuyCntInfo()
|
| | | sendPack.Clear()
|
| | | sendPack.InfoList = []
|
| | | if syncCntDict:
|
| | | for goodsID, buyCnt in syncCntDict.items():
|
| | | buyInfo = ChPyNetSendPack.tagGCStoreServerBuyCnt()
|
| | | buyInfo.GoodsID = goodsID
|
| | | buyInfo.BuyCnt = buyCnt
|
| | | sendPack.InfoList.append(buyInfo)
|
| | | else:
|
| | | universalRecMgr = GameWorld.GetUniversalRecMgr()
|
| | | recTypeListData = universalRecMgr.GetTypeList(RecType)
|
| | | for index in xrange(recTypeListData.Count()):
|
| | | recData = recTypeListData.At(index)
|
| | | buyInfo = ChPyNetSendPack.tagGCStoreServerBuyCnt()
|
| | | buyInfo.GoodsID = recData.GetValue1()
|
| | | buyInfo.BuyCnt = recData.GetValue2()
|
| | | sendPack.InfoList.append(buyInfo)
|
| | | sendPack.Count = len(sendPack.InfoList)
|
| | | if not curPlayer:
|
| | | playerManager = GameWorld.GetPlayerManager()
|
| | | for i in xrange(playerManager.GetActivePlayerCount()):
|
| | | curPlayer = playerManager.GetActivePlayerAt(i)
|
| | | if curPlayer == None or not curPlayer.GetInitOK():
|
| | | continue
|
| | | if PlayerControl.GetIsTJG(curPlayer):
|
| | | continue
|
| | | NetPackCommon.SendFakePack(curPlayer, sendPack)
|
| | | else:
|
| | | if PlayerControl.GetIsTJG(curPlayer):
|
| | | return
|
| | | NetPackCommon.SendFakePack(curPlayer, sendPack)
|
| | | return |
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A9 06 商城全服购买次数通知 #tagGCStoreServerBuyCntInfo
|
| | |
|
| | | class tagGCStoreServerBuyCnt(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("GoodsID", c_int), #商品标识
|
| | | ("BuyCnt", c_int), #购买次数
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | | self.Clear()
|
| | | memmove(addressof(self), stringData[_pos:], self.GetLength())
|
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.GoodsID = 0
|
| | | self.BuyCnt = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagGCStoreServerBuyCnt)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// A9 06 商城全服购买次数通知 //tagGCStoreServerBuyCntInfo:
|
| | | GoodsID:%d,
|
| | | BuyCnt:%d
|
| | | '''\
|
| | | %(
|
| | | self.GoodsID,
|
| | | self.BuyCnt
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagGCStoreServerBuyCntInfo(Structure):
|
| | | Head = tagHead()
|
| | | Count = 0 #(WORD Count)//数量
|
| | | InfoList = list() #(vector<tagGCStoreServerBuyCnt> InfoList)//次数信息
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA9
|
| | | self.Head.SubCmd = 0x06
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | for i in range(self.Count):
|
| | | temInfoList = tagGCStoreServerBuyCnt()
|
| | | _pos = temInfoList.ReadData(_lpData, _pos)
|
| | | self.InfoList.append(temInfoList)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA9
|
| | | self.Head.SubCmd = 0x06
|
| | | self.Count = 0
|
| | | self.InfoList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 2
|
| | | for i in range(self.Count):
|
| | | length += self.InfoList[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteWORD(data, self.Count)
|
| | | for i in range(self.Count):
|
| | | data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | Count:%d,
|
| | | InfoList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.Count,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagGCStoreServerBuyCntInfo=tagGCStoreServerBuyCntInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCStoreServerBuyCntInfo.Head.Cmd,m_NAtagGCStoreServerBuyCntInfo.Head.SubCmd))] = m_NAtagGCStoreServerBuyCntInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #A9 21 角色改名结果 #tagUpdatePlayerNameResult
|
| | |
|
| | | class tagUpdatePlayerNameResult(Structure):
|
| | |
| | |
|
| | | 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):
|
| | | 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.DebugLog("全服购买次数已经在查询中, 不重复查询 itemIndex=%s" % itemIndex)
|
| | | return
|
| | | cmdStr = '%s' % ([itemIndex, serverLimitCnt, clientBuyCount, totalItemList, mainItemID, limitBuyCnt])
|
| | | 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, ipyData)
|
| | | DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey, ipyData)
|
| | |
|
| | | return
|
| | |
|
| | | def DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, ipyData=None):
|
| | | 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()
|
| | |
| | | if not curItemObj:
|
| | | continue
|
| | | userData = curItemObj.GetUserData()
|
| | | 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()
|
| | | 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)
|
| | |
| | | ("DWORD", "MoneyOriginal", 0),
|
| | | ("DWORD", "LimitValue", 0),
|
| | | ("char", "NotifyMark", 0),
|
| | | ("char", "MailKey", 0),
|
| | | ),
|
| | |
|
| | | "ActSpringSale":(
|
| | |
| | | self.MoneyOriginal = 0
|
| | | self.LimitValue = 0
|
| | | self.NotifyMark = "" |
| | | self.MailKey = "" |
| | | return |
| | | |
| | | def GetID(self): return self.ID # ID
|
| | |
| | | def GetMoneyOriginal(self): return self.MoneyOriginal # 原价
|
| | | def GetLimitValue(self): return self.LimitValue # 限制条件
|
| | | def GetNotifyMark(self): return self.NotifyMark # 广播提示 |
| | | def GetMailKey(self): return self.MailKey # 背包不足时邮件KEY |
| | | |
| | | # 限时特惠表 |
| | | class IPY_ActSpringSale(): |
| | |
| | | GameWorld.DebugLog("GY_Query_GetStoreServerBuyCnt funResult=%s" % funResult)
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_StoreQueryState, 0)
|
| | | result = eval(funResult)
|
| | | if len(result) != 6:
|
| | | if len(result) != 7:
|
| | | return
|
| | | itemIndex, serverLimitCnt, clientBuyCount, totalItemList, mainItemID, limitBuyCnt = result
|
| | | FunctionNPCCommon.DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt)
|
| | | itemIndex, serverLimitCnt, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey = result
|
| | | FunctionNPCCommon.DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey)
|
| | |
|
| | | return
|
| | |
|