From 1b279c6a8db9e6ec8a56371c555140de1f8cb40b Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期日, 28 九月 2025 14:12:25 +0800 Subject: [PATCH] 219 【付费内容】首充-服务端 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldGift.py | 293 ++++++++++++++++++++-------------------------------------- 1 files changed, 100 insertions(+), 193 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldGift.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldGift.py index 06d0f9a..0253314 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldGift.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldGift.py @@ -2,168 +2,143 @@ # -*- coding: GBK -*- #------------------------------------------------------------------------------- # -#------------------------------------------------------------------------------- +##@package Player.PlayerGoldGift # -##@package PlayerGoldGift -# -# @todo: 记录玩家的充值豪礼奖励信息,二进制位标示,目前用了一个字典 +# @todo:充值礼包 # @author hxp -# @date 2013-10-16 17:00 +# @date 2025-09-28 +# @version 1.0 # -# @version 3.0 -# 简要说明: -# 详细描述: -# @change: "2013-10-22 11:10" hxp 修改读取奖励物品表方式 -# @change: "2013-11-12 17:00" hxp 增加首充奖励领取逻辑 -# @change: "2013-12-09 18:00" hxp 增加领奖全服广播mark -# @change: "2014-05-11 14:35" xcc 增加mark如果为空,就不提示 -# @change: "2014-06-06 20:30" hxp 领奖全服广播修改 -# @change: "2014-06-12 21:00" hxp 增加天天首充 -# @change: "2014-08-22 12:00" hxp 去除多余全服广播 -# @change: "2014-10-09 14:00" hxp 首充/天天首充规则修改,天天首充一天只能领取一次 -# @change: "2014-12-16 18:00" hxp 发送充值豪礼发送邮件 -# @change: "2014-12-22 14:00" hxp 增加单日充值多选一礼包 -# @change: "2015-02-06 10:30" hxp 单日充值多选一礼包支持配置星期几 -# @change: "2015-02-11 18:30" hxp 单日充值多选一礼包开服前几天不开启的仅限制星期几的活动 -# @change: "2015-04-23 12:00" hxp 当日充值多选一礼包支持多个钻石档奖励 -# @change: "2015-04-28 16:00" hxp 增加每日充值元宝数通知 -# @change: "2015-05-21 14:30" hxp 增加当日充值无限领取礼包 -# @change: "2015-06-09 20:30" hxp 奖励名称改为客户端配置 -# @change: "2016-01-26 15:00" hxp PY表支持重读 -# @change: "2016-06-27 14:00" hxp 首充支持可配置额度 -#------------------------------------------------------------------------------ -#"""Version = 2017-05-12 18:00""" -#------------------------------------------------------------------------------ +# 详细描述: 充值礼包,主要一些常用、通用的 +# +#------------------------------------------------------------------------------- +#"""Version = 2025-09-28 14:30""" +#------------------------------------------------------------------------------- + +import ChConfig import GameWorld import IPY_GameWorld import ItemControler -import ChConfig -import ItemCommon import PlayerControl -import ShareDefine import DataRecordPack import ChPyNetSendPack import NetPackCommon import IpyGameDataPY import CommFunc -import ChEquip +import ObjPool import time +def OnDay(curPlayer): + DoDailyPackBuyGiftOnDay(curPlayer) + return + +def OnLogin(curPlayer): + Sync_FirstChargeInfo(curPlayer) + Sync_HistoryChargeAwardGetRecordInfo(curPlayer) + Sync_DailyPackBuyGiftInfo(curPlayer) + return + +def OnGiftByCTGID(curPlayer, ctgID): + OnActFirstCharge(curPlayer, ctgID) + OnActiviteDailyPackBuyGift(curPlayer, ctgID) + return + ##------------------------------------------------------------------------------ -def DoFirstGoldOpen(curPlayer): - ## 首充开启 记录提示剩余时间 - if curPlayer.GetChangeCoinPointTotal(): + +def ClearFirstCharge(curPlayer): + ## 重置首充 - 一般是GM用 + resetCTGIDList = [] + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetFirstChargeCount()): + ipyData = ipyDataMgr.GetFirstChargeByIndex(index) + firstID = ipyData.GetFirstID() + ctgID = ipyData.GetNeedCTGID() + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstChargeTime % firstID, 0) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstChargeRecord % firstID, 0) + resetCTGIDList.append(ctgID) + Sync_FirstChargeInfo(curPlayer) + return + +def OnActFirstCharge(curPlayer, ctgID): + ## 激活首充档位 + firstIpyData = None + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetFirstChargeCount()): + ipyData = ipyDataMgr.GetFirstChargeByIndex(index) + if ipyData.GetNeedCTGID() == ctgID: + firstIpyData = ipyData + break + + if not firstIpyData: return - showSysTime = IpyGameDataPY.GetFuncCfg("FirstGold", 3) - if not showSysTime: - return - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstGoldRemainTime, showSysTime) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstGoldTipStartTime, int(time.time())) - Sync_FirstGoldTime(curPlayer) - return - -def UpdateFirstGoldTime(curPlayer): - #更新首充提示剩余时间 - remainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstGoldRemainTime) - if not remainTime: + firstID = firstIpyData.GetFirstID() + chargeTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstChargeTime % firstID) + if chargeTime: + GameWorld.DebugLog("该首充档位已经激活过了,不重复激活: ctgID=%s,chargeTime=%s" % (ctgID, chargeTime)) return - if curPlayer.GetChangeCoinPointTotal(): - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstGoldRemainTime, 0) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstGoldTipStartTime, 0) - else: - curTime = int(time.time()) - startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstGoldTipStartTime) - remainTime = max(0, remainTime - (curTime - startTime)) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstGoldRemainTime, remainTime) - if not remainTime: - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstGoldTipStartTime, 0) + + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstChargeTime % firstID, int(time.time())) + GameWorld.DebugLog("记录首充档位充值时间戳: ctgID=%s" % ctgID) + Sync_FirstChargeInfo(curPlayer) return -def Sync_FirstGoldTime(curPlayer): - ##通知首充提示剩余时间 - showSysTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstGoldRemainTime) - if not showSysTime: - return - sendPack = ChPyNetSendPack.tagMCFirstGoldTime() - sendPack.Clear() - sendPack.FirstGoldRemainTime = showSysTime - NetPackCommon.SendFakePack(curPlayer, sendPack) - return - - -def GetPlayerGoldGiftFirst(curPlayer, giftDay): +def GetPlayerFirstCharge(curPlayer, giftDay, firstIDStr): '''领取玩家首充奖励 @param dayIndex: 首充第几天奖励 ''' - - if not giftDay: + firstID = GameWorld.ToIntDef(firstIDStr) + if not firstID or not giftDay: return - openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1 - firstGoldServerDay = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstGoldServerDay) - if not firstGoldServerDay: - GameWorld.DebugLog("还未充值过!firstGoldServerDay=%s" % firstGoldServerDay) + playerID = curPlayer.GetPlayerID() + chargeTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstChargeTime % firstID) + if not chargeTime: + GameWorld.DebugLog("该档位未首充! firstID=%s" % firstID, playerID) return - canGetMaxDay = openServerDay - firstGoldServerDay + 1 + + canGetMaxDay = GameWorld.GetDiff_Day(int(time.time()), chargeTime) + 1 if giftDay > canGetMaxDay: - GameWorld.DebugLog("还未到可领取的首充天,无法领取!openServerDay=%s,firstGoldServerDay=%s,canGetMaxDay=%s < giftDay=%s" - % (openServerDay, firstGoldServerDay, canGetMaxDay, giftDay)) + GameWorld.DebugLog("还未到可领取的首充天,无法领取!chargeTime=%s,giftDay=%s > %s" + % (GameWorld.ChangeTimeNumToStr(chargeTime), giftDay, canGetMaxDay), playerID) return - dayIndex = giftDay - 1 - getRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GoldGiftFirstRecord) - if getRecord & pow(2, dayIndex): - GameWorld.DebugLog("已经领取过首充奖励!giftDay=%s" % giftDay, curPlayer.GetPlayerID()) + getRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstChargeRecord % firstID) + if getRecord & pow(2, giftDay): + GameWorld.DebugLog("已经领取过首充奖励!firstID=%s,giftDay=%s,getRecord=%s" % (firstID, giftDay, getRecord), playerID) return - if not curPlayer.GetChangeCoinPointTotal(): - GameWorld.DebugLog("没有充值过,无法领取首充奖励!", curPlayer.GetPlayerID()) - return - - ipyData = IpyGameDataPY.GetIpyGameData("FirstGold", giftDay) + ipyData = IpyGameDataPY.GetIpyGameData("FirstCharge", firstID) if not ipyData: - return - jobItemInfoDict = ipyData.GetJobItemInfo() - commItemList = ipyData.GetCommItemList() - - rewardItemList = [] - jobStr = str(curPlayer.GetJob()) - if jobStr in jobItemInfoDict: - rewardItemList += jobItemInfoDict[jobStr] - rewardItemList += commItemList - - if not rewardItemList: return - needSpace = len(rewardItemList) - - # 检查背包 - packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace) - if needSpace > packSpace: - PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371") + if not hasattr(ipyData, "GetAwardListDay%s" % giftDay): return + awardList = getattr(ipyData, "GetAwardListDay%s" % giftDay)() # 更新已领取成功标记 - updGetRecord = getRecord | pow(2, dayIndex) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GoldGiftFirstRecord, updGetRecord) - GameWorld.DebugLog("领取首充奖励: giftDay=%s,getRecord=%s,updGetRecord=%s, %s" % (giftDay, getRecord, updGetRecord, rewardItemList)) + updGetRecord = getRecord | pow(2, giftDay) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstChargeRecord % firstID, updGetRecord) + GameWorld.DebugLog("领取首充奖励: firstID=%s,giftDay=%s,getRecord=%s,updGetRecord=%s, %s" % (firstID, giftDay, getRecord, updGetRecord, awardList)) - # 给物品 - isAuctionItem = False - for itemID, itemCount in rewardItemList: - ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem]) - ItemControler.NotifyGiveAwardInfo(curPlayer, rewardItemList, "GoldGiftFirst") + ItemControler.GivePlayerItemOrMail(curPlayer, awardList, event=["FirstCharge", False, {}]) - # 全服提示 - if len(rewardItemList) >= 2: - PlayerControl.WorldNotify(0, "FirstPayReward1", [curPlayer.GetPlayerName(), rewardItemList[0][0], rewardItemList[1][0], giftDay]) - - # 记录领取事件 - infoDict = {"GiftDay":giftDay, "ItemList":rewardItemList} - DataRecordPack.DR_GoldGiftGiveItem(curPlayer, "FirstGoldGift", infoDict) - - # 通知客户端 - Sync_FirstGoldInfo(curPlayer) + Sync_FirstChargeInfo(curPlayer) + return + +def Sync_FirstChargeInfo(curPlayer): + ## 通知首充信息 + clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCFirstChargeInfo) + clientPack.FirstChargeList = [] + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetFirstChargeCount()): + ipyData = ipyDataMgr.GetFirstChargeByIndex(index) + firstID = ipyData.GetFirstID() + firstCharge = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCFirstCharge) + firstCharge.ChargeTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstChargeTime % firstID) + firstCharge.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstChargeRecord % firstID) + clientPack.FirstChargeList.append(firstCharge) + clientPack.Count = len(clientPack.FirstChargeList) + NetPackCommon.SendFakePack(curPlayer, clientPack) return ################################ 每日打包直购礼包 ################################### @@ -341,73 +316,6 @@ ################################################################### -## 充值豪礼OnDay -# @param curPlayer: 玩家 -# @return: None -def OnDay(curPlayer): - DoDailyPackBuyGiftOnDay(curPlayer) - return - -## 充值豪礼OnLogin -# @param curPlayer: 玩家 -# @return: None -def OnLogin(curPlayer): - Sync_FirstGoldInfo(curPlayer) - - Sync_FirstGoldTime(curPlayer) - Sync_HistoryChargeAwardGetRecordInfo(curPlayer) - #更新首充提示开始计时时间 - if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstGoldRemainTime): - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstGoldTipStartTime, int(time.time())) - Sync_DailyPackBuyGiftInfo(curPlayer) - return - -## 玩家充值元宝 -# @param curPlayer: 玩家 -# @param addGold: 充元宝数 -# @return: None -def OnPlayerChargeGold(curPlayer): - return - -def OnGiftByCTGID(curPlayer, ctgID): - - firstGoldCTGIDList = IpyGameDataPY.GetFuncEvalCfg("FirstGold", 4) - if ctgID in firstGoldCTGIDList: - OnActiviteFirstGold(curPlayer) - - OnActiviteDailyPackBuyGift(curPlayer, ctgID) - return - -def OnActiviteFirstGold(curPlayer): - firstGoldServerDay = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstGoldServerDay) - if not firstGoldServerDay: - recordServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1 - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstGoldServerDay, recordServerDay) - GameWorld.DebugLog("记录首充开服天: recordServerDay=%s" % recordServerDay) - Sync_FirstGoldInfo(curPlayer) - - return - -def Sync_FirstGoldInfo(curPlayer): - ## 通知首充信息 - sendPack = ChPyNetSendPack.tagMCFirstGoldInfo() - sendPack.Clear() - sendPack.FirstGoldRewardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GoldGiftFirstRecord) - sendPack.FirstGoldTry = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstGoldTry) - sendPack.FirstGoldServerDay = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstGoldServerDay) - NetPackCommon.SendFakePack(curPlayer, sendPack) - return - -#// A5 11 试用首充武器 #tagCMTryFirstGoldItem -# -#struct tagCMTryFirstGoldItem -# -#{ -# tagHead Head; -#}; -def OnTryFirstGoldItem(index, clientData, tick): - return - def OnGetHistoryRechargeAward(curPlayer, awardID): # 领取历史充值奖励 @@ -460,7 +368,6 @@ DataRecordPack.SendEventPack("HistoryRechargeAward", {'awardID':awardID, 'needCoin':needCoin}, curPlayer) return - ## 通知等级奖励领取记录信息 # @param None # @return None @@ -469,4 +376,4 @@ sendPack.Clear() sendPack.AwardGetRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HistoryChargeAwardGetRecord, 0) NetPackCommon.SendFakePack(curPlayer, sendPack) - return \ No newline at end of file + return -- Gitblit v1.8.0