hxp
2023-11-27 c490fac390e7c495424462d769c52c70b47a34ba
10014 【主干】【港台】【砍树】多个直购一次打包购买功能
5个文件已修改
302 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldGift.py 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -37069,6 +37069,66 @@
#------------------------------------------------------
# AA 03 每日打包直购礼包 #tagMCDailyPackBuyGiftInfo
class  tagMCDailyPackBuyGiftInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("PackBuyTime", c_int),    # 打包购买的时间戳,如果有该值,代表已经一次性打包购买了,可根据次时间戳算出当前是第几天
                  ("BuyStateToday", c_int),    # 今日礼包购买状态,按礼包索引二进制位计算代表是否已购买,仅非打包购买状态下有用
                  ("AwardState", c_int),    # 今日礼包领奖状态,按礼包索引二进制位计算代表是否已领取
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xAA
        self.SubCmd = 0x03
        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.Cmd = 0xAA
        self.SubCmd = 0x03
        self.PackBuyTime = 0
        self.BuyStateToday = 0
        self.AwardState = 0
        return
    def GetLength(self):
        return sizeof(tagMCDailyPackBuyGiftInfo)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// AA 03 每日打包直购礼包 //tagMCDailyPackBuyGiftInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                PackBuyTime:%d,
                                BuyStateToday:%d,
                                AwardState:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.PackBuyTime,
                                self.BuyStateToday,
                                self.AwardState
                                )
        return DumpString
m_NAtagMCDailyPackBuyGiftInfo=tagMCDailyPackBuyGiftInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCDailyPackBuyGiftInfo.Cmd,m_NAtagMCDailyPackBuyGiftInfo.SubCmd))] = m_NAtagMCDailyPackBuyGiftInfo
#------------------------------------------------------
# AA 24 每日免费直购礼包信息 #tagMCDayFreeGoldGiftState
class  tagMCDayFreeGoldGiftState(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4041,6 +4041,13 @@
Def_PDict_GodGiftResetCount = "ActGodGiftResetCount_%s" #已重置次数,参数:(活动编号)
Def_PDict_GodGiftAwardPool = "ActGodGiftAwardPool_%s" #奖池状态,参数:(活动编号) 0-未选择;1-已选择;2-已抽完
Def_PDict_GodGiftItemState = "ActGodGiftItemState_%s_%s_%s" #库物品状态,参数:(活动编号, 库, 编号) 已被选择次数*100+本奖池是否被选择*10+本奖池是否已被抽中
#每日打包直购礼包
Def_PDict_DailyPackBuyGiftBuy = "DailyPackBuyGiftBuy"  # 每日打包直购礼包 - 今日购买状态,按索引位记录今日是否已购买
Def_PDict_DailyPackBuyGiftRecord = "DailyPackBuyGiftRecord"  # 每日打包直购礼包 - 今日领取记录,按索引位记录今日是否已领取
Def_PDict_DailyPackBuyGiftPackTime = "DailyPackBuyGiftPackTime"  # 每日打包直购礼包 - 打包购买时间戳
Def_PDict_DailyPackBuyGiftOnDayTime = "DailyPackBuyGiftOnDayTime"  # 每日打包直购礼包 - 上次处理过天时间戳
#-------------------------------------------------------------------------------
#开服活动,Def_PDictType_OpenServerCampaign
@@ -5805,7 +5812,8 @@
Def_RewardType_CustomAward, #自定义奖励 61
Def_RewardType_RealmXXZL, #境界修仙之路奖励 62
Def_RewardType_FamilyBossHurt, #仙盟boss伤害奖励 63
)= range(64)
Def_RewardType_DailyPackBuyGift, #打包直购礼包奖励 64
)= range(65)
#boss复活相关活动定义
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -37069,6 +37069,66 @@
#------------------------------------------------------
# AA 03 每日打包直购礼包 #tagMCDailyPackBuyGiftInfo
class  tagMCDailyPackBuyGiftInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("PackBuyTime", c_int),    # 打包购买的时间戳,如果有该值,代表已经一次性打包购买了,可根据次时间戳算出当前是第几天
                  ("BuyStateToday", c_int),    # 今日礼包购买状态,按礼包索引二进制位计算代表是否已购买,仅非打包购买状态下有用
                  ("AwardState", c_int),    # 今日礼包领奖状态,按礼包索引二进制位计算代表是否已领取
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xAA
        self.SubCmd = 0x03
        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.Cmd = 0xAA
        self.SubCmd = 0x03
        self.PackBuyTime = 0
        self.BuyStateToday = 0
        self.AwardState = 0
        return
    def GetLength(self):
        return sizeof(tagMCDailyPackBuyGiftInfo)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// AA 03 每日打包直购礼包 //tagMCDailyPackBuyGiftInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                PackBuyTime:%d,
                                BuyStateToday:%d,
                                AwardState:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.PackBuyTime,
                                self.BuyStateToday,
                                self.AwardState
                                )
        return DumpString
m_NAtagMCDailyPackBuyGiftInfo=tagMCDailyPackBuyGiftInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCDailyPackBuyGiftInfo.Cmd,m_NAtagMCDailyPackBuyGiftInfo.SubCmd))] = m_NAtagMCDailyPackBuyGiftInfo
#------------------------------------------------------
# AA 24 每日免费直购礼包信息 #tagMCDayFreeGoldGiftState
class  tagMCDayFreeGoldGiftState(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -5695,6 +5695,9 @@
    #仙盟boss伤害奖励
    elif rewardType == ChConfig.Def_RewardType_FamilyBossHurt:
        GameLogic_FamilyBoss.GetFamilyBossHurtAward(curPlayer, dataEx, dataExStr)
    #打包直购礼包奖励
    elif rewardType == ChConfig.Def_RewardType_DailyPackBuyGift:
        PlayerGoldGift.GetDailyPackBuyGift(curPlayer, dataEx)
    #玩法前瞻奖励
    elif rewardType == ChConfig.Def_RewardType_GameNotice:
        OnGiveAwardByClient(curPlayer, rewardType, ChConfig.Def_PDict_GameNoticeAwardState, IpyGameDataPY.GetFuncEvalCfg("GameNoticeReward", 1))
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldGift.py
@@ -169,12 +169,177 @@
    Sync_FirstGoldInfo(curPlayer)
    return
################################ 每日打包直购礼包 ###################################
def OnActiviteDailyPackBuyGift(curPlayer, ctgID):
    ## 激活每日打包直购礼包
    isActivite = False
    packCTGIDList = IpyGameDataPY.GetFuncEvalCfg("DailyPackBuyGift", 3) # 打包购买对应充值ID列表
    if ctgID in packCTGIDList:
        isActivite = True
        # 如果是打包购买的,不管什么状态,直接全部重置
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyPackBuyGiftPackTime, int(time.time()))
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyPackBuyGiftBuy, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyPackBuyGiftRecord, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyPackBuyGiftOnDayTime, 0)
        GameWorld.Log("激活打包直购礼包: ctgID=%s" % ctgID, curPlayer.GetID())
    else:
        actCTGIDDict = IpyGameDataPY.GetFuncEvalCfg("DailyPackBuyGift", 2, {}) # 礼包索引对应充值ID列表,没有配置的代表可免费领取
        for awardIndexStr, ctgIDList in actCTGIDDict.items():
            if ctgID not in ctgIDList:
                continue
            isActivite = True
            awardIndex = int(awardIndexStr)
            buyState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyPackBuyGiftBuy)
            updBuyState = buyState|pow(2, awardIndex)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyPackBuyGiftBuy, updBuyState)
            GameWorld.Log("单独激活打包直购礼包: awardIndex=%s,ctgID=%s" % (awardIndex, ctgID), curPlayer.GetID())
            break
    if isActivite:
        Sync_DailyPackBuyGiftInfo(curPlayer)
    return isActivite
def GetDailyPackBuyGift(curPlayer, awardIndex):
    ## 领取每日打包直购礼包
    playerID = curPlayer.GetPlayerID()
    giftItemDict = IpyGameDataPY.GetFuncEvalCfg("DailyPackBuyGift", 1, {}) # 礼包索引对应礼包物品列表
    if str(awardIndex) not in giftItemDict:
        GameWorld.DebugLog("不存在该每日打包直购礼包! awardIndex=%s" % awardIndex, playerID)
        return
    itemList = giftItemDict[str(awardIndex)]
    getRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyPackBuyGiftRecord) # 领取记录
    if getRecord&pow(2, int(awardIndex)):
        GameWorld.DebugLog("已经领取过该每日打包直购礼包! awardIndex=%s,getRecord=%s" % (awardIndex, getRecord), playerID)
        return
    packBuyTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyPackBuyGiftPackTime) # 打包购买时间戳
    # 打包购买的
    if packBuyTime:
        curTime = int(time.time())
        maxDays = IpyGameDataPY.GetFuncCfg("DailyPackBuyGift", 4)
        curDays = GameWorld.GetDiff_Day(curTime, packBuyTime) + 1 # 打包购买第x天,购买当天为第1天
        if curDays > maxDays:
            GameWorld.DebugLog("打包直购礼包超过可领取最大天: curDays=%s > %s" % (curDays, maxDays), playerID)
            return
        GameWorld.DebugLog("已打包购买: packBuyTime=%s(%s),curDays=%s" % (packBuyTime, GameWorld.ChangeTimeNumToStr(packBuyTime), curDays), playerID)
    else:
        actCTGIDDict = IpyGameDataPY.GetFuncEvalCfg("DailyPackBuyGift", 2, {}) # 礼包索引对应充值ID列表,没有配置的代表可免费领取
        buyState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyPackBuyGiftBuy) # 单独购买状态
        if str(awardIndex) in actCTGIDDict and not buyState&pow(2, awardIndex):
            GameWorld.DebugLog("今日该打包直购礼包未购买,无法领取: awardIndex=%s,buyState=%s" % (awardIndex, buyState), playerID)
            return
        GameWorld.DebugLog("已单独购买: awardIndex=%s,buyState=%s" % (awardIndex, buyState), playerID)
    # 检查背包
    if not ItemControler.CheckPackSpaceEnough(curPlayer, itemList):
        return
    # 更新已领取成功标记
    updRecord = getRecord|pow(2, awardIndex)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyPackBuyGiftRecord, updRecord)
    Sync_DailyPackBuyGiftInfo(curPlayer)
    GameWorld.DebugLog("领取打包直购礼包: awardIndex=%s,updRecord=%s" % (awardIndex, updRecord), playerID)
    # 给物品
    for itemID, itemCount, isAuctionItem in itemList:
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
    return
def DoDailyPackBuyGiftOnDay(curPlayer):
    ## 每日打包直购礼包过天
    playerID = curPlayer.GetPlayerID()
    curTime = int(time.time())
    # 补发未领取的天数奖励
    lastOnDayTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyPackBuyGiftOnDayTime) # 上次处理的过天时间
    packBuyTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyPackBuyGiftPackTime) # 打包购买时间戳
    getRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyPackBuyGiftRecord) # 领取记录
    buyState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyPackBuyGiftBuy) # 单独购买状态
    GameWorld.DebugLog("每日打包直购礼包过天: packBuyTime=%s(%s),lastOnDayTime=%s(%s),getRecord=%s,buyState=%s"
                       % (packBuyTime, GameWorld.ChangeTimeNumToStr(packBuyTime),
                          lastOnDayTime, GameWorld.ChangeTimeNumToStr(lastOnDayTime), getRecord, buyState), playerID)
    giftItemDict = IpyGameDataPY.GetFuncEvalCfg("DailyPackBuyGift", 1, {}) # 礼包索引对应礼包物品列表
    actCTGIDDict = IpyGameDataPY.GetFuncEvalCfg("DailyPackBuyGift", 2, {}) # 礼包索引对应充值ID列表,没有配置的代表可免费领取
    # 打包购买的
    if packBuyTime:
        maxDays = IpyGameDataPY.GetFuncCfg("DailyPackBuyGift", 4)
        curDays = GameWorld.GetDiff_Day(curTime, packBuyTime) + 1 # 打包购买第x天,购买当天为第1天
        alreadyAwardDays = GameWorld.GetDiff_Day(lastOnDayTime, packBuyTime) if lastOnDayTime else 0 # 已经奖励过的天数
        GameWorld.DebugLog("    alreadyAwardDays=%s,curDays=%s" % (alreadyAwardDays, curDays), playerID)
        # 补发上次离线天的
        awardDays = alreadyAwardDays + 1
        for awardIndexStr, addItemList in giftItemDict.items():
            if getRecord&pow(2, int(awardIndexStr)):
                GameWorld.DebugLog("    已经领取过该奖励了,不补发! awardIndex=%s,getRecord=%s" % (awardIndexStr, getRecord), playerID)
                continue
            GameWorld.DebugLog("    补发离线天! awardDays=%s,awardIndex=%s" % (awardDays, awardIndexStr), playerID)
            paramList = [awardDays]
            PlayerControl.SendMailByKey("DailyPackBuyGift1", [playerID], addItemList, paramList)
        # 补发未登录完整天的
        for day in range(awardDays + 1, curDays):
            if day > maxDays:
                break
            paramList = [day]
            GameWorld.DebugLog("    补发完整天! day=%s" % (day), playerID)
            for addItemList in giftItemDict.values():
                PlayerControl.SendMailByKey("DailyPackBuyGift1", [playerID], addItemList, paramList)
        # 超过最大天了,重置所有
        if curDays > maxDays:
            GameWorld.DebugLog("    超过最大天了,重置所有! curDays=%s" % (curDays), playerID)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyPackBuyGiftPackTime, 0)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyPackBuyGiftOnDayTime, 0)
        else:
            GameWorld.DebugLog("    未超过最大天,过天重置! curDays=%s" % (curDays), playerID)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyPackBuyGiftOnDayTime, curTime)
    else:
        # 单天补发的
        for awardIndexStr, addItemList in giftItemDict.items():
            if awardIndexStr in actCTGIDDict:
                if not buyState&pow(2, int(awardIndexStr)):
                    GameWorld.DebugLog("没有打包购买且没有单独购买,不补发! awardIndex=%s,packBuyTime=%s,buyState=%s"
                                       % (awardIndexStr, packBuyTime, buyState), playerID)
                    continue
            if getRecord&pow(2, int(awardIndexStr)):
                GameWorld.DebugLog("已经领取过该奖励了,不补发! awardIndex=%s,getRecord=%s" % (awardIndexStr, getRecord), playerID)
                continue
            GameWorld.DebugLog("    补发离线天! awardIndex=%s" % (awardIndexStr), playerID)
            paramList = []
            PlayerControl.SendMailByKey("DailyPackBuyGift2", [playerID], addItemList, paramList)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyPackBuyGiftBuy, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyPackBuyGiftRecord, 0)
    Sync_DailyPackBuyGiftInfo(curPlayer)
    return
def Sync_DailyPackBuyGiftInfo(curPlayer):
    clientPack = ChPyNetSendPack.tagMCDailyPackBuyGiftInfo()
    clientPack.Clear()
    clientPack.PackBuyTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyPackBuyGiftPackTime)
    clientPack.BuyStateToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyPackBuyGiftBuy)
    clientPack.AwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyPackBuyGiftRecord)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
###################################################################
## 充值豪礼OnDay
#  @param curPlayer: 玩家
#  @return: None
def OnDay(curPlayer):
    DoDailyPackBuyGiftOnDay(curPlayer)
    return
## 充值豪礼OnLogin
@@ -188,6 +353,7 @@
    #更新首充提示开始计时时间
    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstGoldRemainTime):
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstGoldTipStartTime, int(time.time()))
    Sync_DailyPackBuyGiftInfo(curPlayer)
    return
## 玩家充值元宝
@@ -202,7 +368,8 @@
    firstGoldCTGIDList = IpyGameDataPY.GetFuncEvalCfg("FirstGold", 4)
    if ctgID in firstGoldCTGIDList:
        OnActiviteFirstGold(curPlayer)
    OnActiviteDailyPackBuyGift(curPlayer, ctgID)
    return
def OnActiviteFirstGold(curPlayer):