xdh
2018-10-17 5abe612e298a749615bb78a73b1b18eabd013505
4075 增加商城全服购买次数封包,商城支持背包不足发邮件
7个文件已修改
307 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerStore.py 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GetStoreServerBuyCnt.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -762,6 +762,7 @@
    DWORD        MoneyOriginal;    //原价
    DWORD        LimitValue;    //限制条件
    char        NotifyMark;    //广播提示
    char        MailKey;    //背包不足时邮件KEY
};
//限时特惠表
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -4234,6 +4234,114 @@
#------------------------------------------------------
# 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):
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerStore.py
@@ -18,10 +18,11 @@
"""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
@@ -29,7 +30,7 @@
#  @param None
#  @return None
def OnPlayerLogin(curPlayer):
    PlayerUniversalGameRec.SendUniversalGameRecInfo(curPlayer, RecType)
    SyncStoreServerBuyInfo(curPlayer)
    return
@@ -61,17 +62,10 @@
    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):
@@ -80,6 +74,7 @@
    recTypeListData = universalRecMgr.GetTypeList(RecType)
    
    delCnt = 0
    syncDict = {}
    for index in xrange(recTypeListData.Count()):
        dataIndex = index - delCnt
        recData = recTypeListData.At(dataIndex)
@@ -89,11 +84,14 @@
            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
@@ -106,3 +104,39 @@
    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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -4234,6 +4234,114 @@
#------------------------------------------------------
# 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):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
@@ -452,12 +452,18 @@
    
    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()):
@@ -473,18 +479,18 @@
            #已经在查询中, 不重复查询
            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()
@@ -516,16 +522,19 @@
        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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -635,6 +635,7 @@
                        ("DWORD", "MoneyOriginal", 0),
                        ("DWORD", "LimitValue", 0),
                        ("char", "NotifyMark", 0),
                        ("char", "MailKey", 0),
                        ),
                "ActSpringSale":(
@@ -2271,6 +2272,7 @@
        self.MoneyOriginal = 0
        self.LimitValue = 0
        self.NotifyMark = ""
        self.MailKey = ""
        return
        
    def GetID(self): return self.ID # ID
@@ -2292,6 +2294,7 @@
    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():
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GetStoreServerBuyCnt.py
@@ -47,10 +47,10 @@
    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