hxp
2025-11-27 6e68408870278c607c7f33df5a5df58c8b7cef78
252 【付费内容】每日特惠-服务端
5个文件已修改
285 ■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3286,8 +3286,6 @@
Def_PDict_MonthCTGCount = "MonthCTGCount_%s"  # 本月充值次数,参数(CTG对应的商品记录ID)
Def_PDict_CTGGoodsBuyCount = "CTGGoodsBuyCount_%s"  # 对应充值商品已购买次数,参数(CTG对应的商品记录ID)
Def_PDict_CTGSelectItemValue = "CTGSelectItemValue_%s"  # 充值自选选择记录,参数(CTG对应的商品记录ID) 每两位存储每个自选索引对应选择的物品索引+1,存储位值为0代表未选择,最多支持选择4种物品
Def_PDict_OnlineRechargeTHAward = "OnlineRechargeTHAward"  # 在线特惠充值额外奖励 - 是否已领取奖励
Def_PDict_DayFreeGoldGiftState = "DayFreeGoldGiftState"  # 每日免费直购礼包领取记录
Def_PDict_FirstChargeRecord = "FirstChargeRecord_%s"  # 首充领取记录,按位记录首充第x天是否已领取,参数(首充ID)
Def_PDict_FirstChargeTime = "FirstChargeTime_%s"  # 首充充值时间戳,参数(首充ID)
Def_PDict_IsReBorn = "Def_PDict_IsReBorn"  # 是否回城复活
@@ -4822,7 +4820,7 @@
Def_RewardType_ManyDayRecharge, #多日连充41
Def_RewardType_InfiniteMoney, #无限货币42
Def_RewardType_SingleRecharge, #单笔累充 43
Def_RewardType_OnlineRechargeTH, #创角在线特惠充值额外奖励 44
Def_RewardType_44, #创角在线特惠充值额外奖励 44
Def_RewardType_SWC, #送万充奖励 45
Def_RewardType_FairyCardSponsor, #仙卡赞助奖励 46
Def_RewardType_CritGodBoxCTG, #暴击神兵奖励 47
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -25067,58 +25067,6 @@
#------------------------------------------------------
# AA 24 每日免费直购礼包信息 #tagMCDayFreeGoldGiftState
class  tagMCDayFreeGoldGiftState(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("DayFreeGoldGiftState", c_ubyte),    #每日免费直购礼包是否已领奖 0-未领 1-已领
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xAA
        self.SubCmd = 0x24
        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 = 0x24
        self.DayFreeGoldGiftState = 0
        return
    def GetLength(self):
        return sizeof(tagMCDayFreeGoldGiftState)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// AA 24 每日免费直购礼包信息 //tagMCDayFreeGoldGiftState:
                                Cmd:%s,
                                SubCmd:%s,
                                DayFreeGoldGiftState:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.DayFreeGoldGiftState
                                )
        return DumpString
m_NAtagMCDayFreeGoldGiftState=tagMCDayFreeGoldGiftState()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCDayFreeGoldGiftState.Cmd,m_NAtagMCDayFreeGoldGiftState.SubCmd))] = m_NAtagMCDayFreeGoldGiftState
#------------------------------------------------------
# AA 42 节日登录奖励活动信息 #tagMCFeastLoginInfo
class  tagMCFeastLoginDayAwardItem(Structure):
@@ -27697,58 +27645,6 @@
m_NAtagMCNewXJSDRecharge=tagMCNewXJSDRecharge()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCNewXJSDRecharge.Cmd,m_NAtagMCNewXJSDRecharge.SubCmd))] = m_NAtagMCNewXJSDRecharge
#------------------------------------------------------
# AA 04 创角在线充值特惠信息 #tagMCOnlineRechargeTH
class  tagMCOnlineRechargeTH(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("AwardState", c_ubyte),    #是否已领取奖励
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xAA
        self.SubCmd = 0x04
        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 = 0x04
        self.AwardState = 0
        return
    def GetLength(self):
        return sizeof(tagMCOnlineRechargeTH)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// AA 04 创角在线充值特惠信息 //tagMCOnlineRechargeTH:
                                Cmd:%s,
                                SubCmd:%s,
                                AwardState:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.AwardState
                                )
        return DumpString
m_NAtagMCOnlineRechargeTH=tagMCOnlineRechargeTH()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCOnlineRechargeTH.Cmd,m_NAtagMCOnlineRechargeTH.SubCmd))] = m_NAtagMCOnlineRechargeTH
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -3278,9 +3278,6 @@
    #历史累计充值领取
    elif rewardType == ChConfig.Def_RewardType_HistoryChargeAward:
        PlayerGoldGift.OnGetHistoryRechargeAward(curPlayer, dataEx)
    #在线特惠充值额外奖励
    elif rewardType == ChConfig.Def_RewardType_OnlineRechargeTH:
        PlayerCoin.OnGetOnlineRechargeTH(curPlayer)
    #创角奖励
    elif rewardType == ChConfig.Def_RewardType_CreateRole:
        OnGetCreateRoleAward(curPlayer)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
@@ -95,10 +95,6 @@
def OnLogin(curPlayer):
    if not DoResetCTGCountByTime(curPlayer):
        Sync_CoinToGoldCountInfo(curPlayer)
    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayFreeGoldGiftState):
        Sync_DayFreeGoldGiftState(curPlayer)
    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OnlineRechargeTHAward):
        SyncOnlineRechargeTH(curPlayer)
    return
def DoResetCTGCountByTime(curPlayer):
@@ -205,9 +201,6 @@
    if syncRecordIDList:
        Sync_CoinToGoldCountInfo(curPlayer, syncRecordIDList)
        
    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayFreeGoldGiftState):
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayFreeGoldGiftState, 0)
        Sync_DayFreeGoldGiftState(curPlayer)
    return
def OnWeek(curPlayer):
@@ -576,21 +569,8 @@
            return
        addDRDict.update({"selectItemList":selectItemList})
        
    totalBuyCountUpd = min(totalBuyCount + 1, ChConfig.Def_UpperLimit_DWord)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CTGGoodsBuyCount % recordID, totalBuyCountUpd)
    addDRDict.update({"totalBuyCountUpd":totalBuyCountUpd})
    todayBuyCountUpd = min(todayBuyCount + 1, ChConfig.Def_UpperLimit_DWord)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TodayCTGCount % recordID, todayBuyCountUpd)
    addDRDict.update({"todayBuyCountUpd":todayBuyCountUpd})
    weekBuyCountUpd = min(weekBuyCount + 1, ChConfig.Def_UpperLimit_DWord)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WeekCTGCount % recordID, weekBuyCountUpd)
    addDRDict.update({"weekBuyCountUpd":weekBuyCountUpd})
    monthBuyCountUpd = min(monthBuyCount + 1, ChConfig.Def_UpperLimit_DWord)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MonthCTGCount % recordID, monthBuyCountUpd)
    addDRDict.update({"monthBuyCountUpd":monthBuyCountUpd})
    totalBuyCountUpd, todayBuyCountUpd, weekBuyCountUpd, monthBuyCountUpd = __addCTGIDBuyCnt(curPlayer, recordID)
    addDRDict.update({"totalBuyCountUpd":totalBuyCountUpd, "todayBuyCountUpd":todayBuyCountUpd, "weekBuyCountUpd":weekBuyCountUpd, "monthBuyCountUpd":monthBuyCountUpd})
    
    giveItemList = []
    giveItemList += GetCTGGiveItemList(ipyData)
@@ -610,8 +590,50 @@
            prizeGold += actPrizeGold
            addDRDict.update({"actRechargePrize":1})
            
    Sync_CoinToGoldCountInfo(curPlayer, [recordID])
    syncRecordIDList = [recordID]
    # 打包购买 - 目前用于每日特惠,有需要可扩展为通用
    if recordID == IpyGameDataPY.GetFuncCfg("DailyTehui", 2):
        packItemDict = {}
        packCTGIDDict = {}
        dailyTehuiCTGIDList = IpyGameDataPY.GetFuncEvalCfg("DailyTehui", 1)
        for ctgID in dailyTehuiCTGIDList:
            ctgIpyData = IpyGameDataPY.GetIpyGameData("CTG", ctgID)
            if not ctgIpyData:
                continue
            if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TodayCTGCount % ctgID):
                continue
            syncRecordIDList.append(ctgID)
            ctgItemList = GetCTGGiveItemList(ctgIpyData)
            packCTGIDDict[ctgID] = ctgItemList
            for itemID, itemCount, _ in ctgItemList:
                packItemDict[itemID] = packItemDict.get(itemID, 0) + itemCount
            __addCTGIDBuyCnt(curPlayer, ctgID)
        if packCTGIDDict:
            GameWorld.Log("打包购买: recordID=%s,packCTGIDDict=%s" % (recordID, packCTGIDDict), curPlayer.GetPlayerID())
            addDRDict.update({"packCTGIDDict":packCTGIDDict})
        for itemID, itemCount in packItemDict.items():
            giveItemList.append([itemID, itemCount, 0])
    Sync_CoinToGoldCountInfo(curPlayer, syncRecordIDList)
    return moneyType, addGold, prizeGold, giveItemList, ipyData
def __addCTGIDBuyCnt(curPlayer, recordID):
    totalBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CTGGoodsBuyCount % recordID)
    totalBuyCountUpd = min(totalBuyCount + 1, ChConfig.Def_UpperLimit_DWord)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CTGGoodsBuyCount % recordID, totalBuyCountUpd)
    todayBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TodayCTGCount % recordID)
    todayBuyCountUpd = min(todayBuyCount + 1, ChConfig.Def_UpperLimit_DWord)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TodayCTGCount % recordID, todayBuyCountUpd)
    weekBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WeekCTGCount % recordID)
    weekBuyCountUpd = min(weekBuyCount + 1, ChConfig.Def_UpperLimit_DWord)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WeekCTGCount % recordID, weekBuyCountUpd)
    monthBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MonthCTGCount % recordID)
    monthBuyCountUpd = min(monthBuyCount + 1, ChConfig.Def_UpperLimit_DWord)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MonthCTGCount % recordID, monthBuyCountUpd)
    return totalBuyCountUpd, todayBuyCountUpd, weekBuyCountUpd, monthBuyCountUpd
def GetSelectItemListInfo(selectItemInfo, selectItemValue):
    errorInfo = ""
@@ -909,82 +931,3 @@
    countInfoPack.RecordCount = len(countInfoPack.CTGCountInfoList)
    NetPackCommon.SendFakePack(curPlayer, countInfoPack)
    return
## ---------- 每日免费直购礼包 ----------------
def OnGetDayFreeGoldGift(curPlayer):
    ''' 领取每日免费直购礼包
    '''
    isGet = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayFreeGoldGiftState)
    if isGet:
        #GameWorld.DebugLog("已经领取过每日免费直购礼包!")
        return
    rewardItemList = IpyGameDataPY.GetFuncEvalCfg("DayFreeGoldGift", 1)
    if not rewardItemList:
        return
    needSpace = len(rewardItemList)
    packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
    if needSpace > packSpace:
        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayFreeGoldGiftState, 1)
    # 给物品
    isAuctionItem = False
    for itemID, itemCount in rewardItemList:
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
    # 通知客户端
    Sync_DayFreeGoldGiftState(curPlayer)
    return
def Sync_DayFreeGoldGiftState(curPlayer):
    clientPack = ChPyNetSendPack.tagMCDayFreeGoldGiftState()
    clientPack.DayFreeGoldGiftState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayFreeGoldGiftState)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
## ------------------------------------------
## ---------- 创角在线充值特惠 ---------------
def OnGetOnlineRechargeTH(curPlayer):
    ## 领取创角在线充值特惠
    awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OnlineRechargeTHAward)
    if awardState:
        #GameWorld.DebugLog("已领取该奖励!")
        return
    # 后端只验证是否有充值其中一个即可,不验证充值时间(充值同步到游戏服务器有时间差)
    canGet = False
    needCtgIDList = IpyGameDataPY.GetFuncEvalCfg("OnlineRechargeTH", 2)
    for ctgID in needCtgIDList:
        if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CTGGoodsBuyCount % ctgID):
            canGet = True
            break
    if not canGet:
        return
    awardItemList = IpyGameDataPY.GetFuncEvalCfg("OnlineRechargeTH", 3)
    if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList):
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnlineRechargeTHAward, 1)
    for itemID, itemCount, isAuctionItem in awardItemList:
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem],
                                     event=["OnlineRechargeTH", False, {}])
    SyncOnlineRechargeTH(curPlayer)
    return
def SyncOnlineRechargeTH(curPlayer):
    clientPack = ChPyNetSendPack.tagMCOnlineRechargeTH()
    clientPack.AwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OnlineRechargeTHAward)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
## ------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -690,7 +690,8 @@
CDBPlayerRefresh_DOTPerDef, # 持续减伤 284
CDBPlayerRefresh_GoldRushEnergy, # 淘金令 285
CDBPlayerRefresh_ArenaTicket, # 挑战券 286
) = range(146, 287)
CDBPlayerRefresh_TehuiPoint, # 特惠印绶 287
) = range(146, 288)
TYPE_Price_Gold_Paper_Money = 5    # 金钱类型,(先用礼券,再用金子)
TYPE_Price_FamilyExp = 6 # 战盟经验
@@ -732,12 +733,13 @@
TYPE_Price_HeroScore = 51    # 招募积分
TYPE_Price_GoldRushEnergy = 52    # 淘金令体力
TYPE_Price_ArenaTicket = 53    # 演武场挑战券
TYPE_Price_TehuiPoint = 54    # 特惠印绶
TYPE_Price_PayCoinDay = 98    # 代币时效,每日过天重置
TYPE_Price_PayCoin = 99    # 代币
#key可用于遍历所有货币,value仅GM相关会用到
MoneyNameDict = {
                 1:"金币", 15:"公会贡献币", 41:"战锤", 42:"将星玉髓", 43:"将魂", 51:"招募积分", 52:"淘金令", 53:"挑战券",
                 1:"金币", 15:"公会贡献币", 41:"战锤", 42:"将星玉髓", 43:"将魂", 51:"招募积分", 52:"淘金令", 53:"挑战券", 54:"特惠印绶",
                 98:"代币时效", 99:"代币"
                 }
#MoneyNameDict = {
@@ -761,6 +763,7 @@
                           TYPE_Price_HeroScore:CDBPlayerRefresh_HeroScore,
                           TYPE_Price_GoldRushEnergy:CDBPlayerRefresh_GoldRushEnergy,
                           TYPE_Price_ArenaTicket:CDBPlayerRefresh_ArenaTicket,
                           TYPE_Price_TehuiPoint:CDBPlayerRefresh_TehuiPoint,
                           TYPE_Price_PayCoinDay:CDBPlayerRefresh_PayCoinDay,
                           #TYPE_Price_Rune:CDBPlayerRefresh_Rune,
                           #TYPE_Price_RuneSplinters:CDBPlayerRefresh_RuneSplinters,
@@ -792,13 +795,6 @@
                         2:CDBPlayerRefresh_MoneyMinusGoldPaper,
                         }
# 高效战斗状态
Def_Battle_Status = (
    Def_Battle_Start,    # 激活
    Def_Battle_Stop,     # ֹͣ
    Def_Battle_Query     # 查询
) = range(1, 4)
# 游戏功能ID定义,需确保唯一,与PyGameFuncControl.txt中FuncId一致
GameFuncID_Official = 10        # 官爵,境界
GameFuncID_Family = 11          # 战盟,仙盟
@@ -809,19 +805,6 @@
# 以下为暂时无用的
GameFuncID_Pet = -1             # 宠物,灵宠 6
GameFuncID_OSSail = -1          # 开服特惠 132
GameFuncID_AddPoint = -1        # 加点功能/灵根功能 145
#家族悬赏任务完成状态记录位标识
Def_ArrestOverState_BitDic = {
    5000:0,
    5001:1,
    5002:2,
    5003:3,
    5004:4,
    5005:5,
    5006:6,
    }
#背包类型
(