From aad1382a82aecd2acc312bf81727882c9eadbdd6 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 04 十一月 2025 15:43:18 +0800
Subject: [PATCH] 237 【福利内容】每日任务/每周任务/章节奖励-服务端(修复有配置任务条件的任务无法取到任务值的bug;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldGift.py | 311 ++++++++++++++++++++-------------------------------
1 files changed, 120 insertions(+), 191 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..25f00a3 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,165 @@
# -*- 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 ShareDefine
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, firstID)
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)
+ if not hasattr(ipyData, "GetAwardListDay%s" % giftDay):
+ return
+ awardList = getattr(ipyData, "GetAwardListDay%s" % giftDay)()
- # 检查背包
- packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
- if needSpace > packSpace:
- PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
+ if not ItemControler.CheckPackSpaceEnough(curPlayer, [itemInfo[:2] for itemInfo in awardList]):
return
# 更新已领取成功标记
- 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))
+ Sync_FirstChargeInfo(curPlayer, firstID)
- # 给物品
- isAuctionItem = False
- for itemID, itemCount in rewardItemList:
- ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
- ItemControler.NotifyGiveAwardInfo(curPlayer, rewardItemList, "GoldGiftFirst")
-
- # 全服提示
- if len(rewardItemList) >= 2:
- PlayerControl.WorldNotify(0, "FirstPayReward1", [curPlayer.GetPlayerName(), rewardItemList[0][0], rewardItemList[1][0], giftDay])
+ isAuctionItem = 0
+ notifyAwardList = []
+ for itemID, itemCount, appointID in awardList:
+ setAttrDict = {ShareDefine.Def_CItemKey_AppointID:appointID} if appointID else {}
+ if not ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, event=["FirstCharge", False, {}], setAttrDict=setAttrDict):
+ continue
+ notifyAwardList.append([itemID, itemCount, isAuctionItem])
+ ItemControler.NotifyGiveAwardInfo(curPlayer, notifyAwardList, "FirstCharge")
+ return
+
+def Sync_FirstChargeInfo(curPlayer, firstID=0):
+ ## 通知首充信息
+ if firstID:
+ syncIDList = [firstID]
+ else:
+ syncIDList = []
+ ipyDataMgr = IpyGameDataPY.IPY_Data()
+ for index in range(ipyDataMgr.GetFirstChargeCount()):
+ ipyData = ipyDataMgr.GetFirstChargeByIndex(index)
+ syncIDList.append(ipyData.GetFirstID())
+
+ firstChargeList = []
+ for firstID in syncIDList:
+ firstCharge = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCFirstCharge)
+ firstCharge.FirstID = firstID
+ firstCharge.ChargeTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstChargeTime % firstID)
+ firstCharge.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstChargeRecord % firstID)
+ firstChargeList.append(firstCharge)
- # 记录领取事件
- infoDict = {"GiftDay":giftDay, "ItemList":rewardItemList}
- DataRecordPack.DR_GoldGiftGiveItem(curPlayer, "FirstGoldGift", infoDict)
+ if not firstChargeList:
+ return
- # 通知客户端
- Sync_FirstGoldInfo(curPlayer)
+ clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCFirstChargeInfo)
+ clientPack.FirstChargeList = firstChargeList
+ clientPack.Count = len(clientPack.FirstChargeList)
+ NetPackCommon.SendFakePack(curPlayer, clientPack)
return
################################ 每日打包直购礼包 ###################################
@@ -341,73 +338,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 +390,6 @@
DataRecordPack.SendEventPack("HistoryRechargeAward", {'awardID':awardID, 'needCoin':needCoin}, curPlayer)
return
-
## 通知等级奖励领取记录信息
# @param None
# @return None
@@ -469,4 +398,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