From 34c3c4d2917865cba8892305130b8d382cb7db28 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 12 三月 2025 15:15:13 +0800
Subject: [PATCH] 10416 【英文】【bt】【GM】【砍树】登录基金和幻境基金 完成后可以重置购买

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerZhanling.py     |   57 ++++++++++++++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py           |    7 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py |    3 +
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                |    7 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                  |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhanling.py      |   10 +++++
 6 files changed, 85 insertions(+), 0 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 944db1d..9e7d65d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -53517,6 +53517,7 @@
     ZhanlingType = 0    #(BYTE ZhanlingType)// 战令类型
     IsActivite = 0    #(BYTE IsActivite)// 普通战令是否已激活
     IsActiviteH = 0    #(BYTE IsActiviteH)// 高级战令是否已激活
+    AllFinishTime = 0    #(DWORD AllFinishTime)// 全部奖励领取完毕的时间戳,未完毕时该值为0,后端会在0点过天时检查可否重置,前端自行做倒计时表现即可
     Value1 = 0    #(DWORD Value1)// 战令对应的自定义值,可选,如登录战令代表开始计算日期时间戳
     RewardCount = 0    #(WORD RewardCount)
     RewardList = list()    #(vector<tagMCZhanling> RewardList)
@@ -53534,6 +53535,7 @@
         self.ZhanlingType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.IsActivite,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.IsActiviteH,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.AllFinishTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.RewardCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
         for i in range(self.RewardCount):
@@ -53550,6 +53552,7 @@
         self.ZhanlingType = 0
         self.IsActivite = 0
         self.IsActiviteH = 0
+        self.AllFinishTime = 0
         self.Value1 = 0
         self.RewardCount = 0
         self.RewardList = list()
@@ -53561,6 +53564,7 @@
         length += 1
         length += 1
         length += 1
+        length += 4
         length += 4
         length += 2
         for i in range(self.RewardCount):
@@ -53574,6 +53578,7 @@
         data = CommFunc.WriteBYTE(data, self.ZhanlingType)
         data = CommFunc.WriteBYTE(data, self.IsActivite)
         data = CommFunc.WriteBYTE(data, self.IsActiviteH)
+        data = CommFunc.WriteDWORD(data, self.AllFinishTime)
         data = CommFunc.WriteDWORD(data, self.Value1)
         data = CommFunc.WriteWORD(data, self.RewardCount)
         for i in range(self.RewardCount):
@@ -53586,6 +53591,7 @@
                                 ZhanlingType:%d,
                                 IsActivite:%d,
                                 IsActiviteH:%d,
+                                AllFinishTime:%d,
                                 Value1:%d,
                                 RewardCount:%d,
                                 RewardList:%s
@@ -53595,6 +53601,7 @@
                                 self.ZhanlingType,
                                 self.IsActivite,
                                 self.IsActiviteH,
+                                self.AllFinishTime,
                                 self.Value1,
                                 self.RewardCount,
                                 "..."
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index da6ff5d..f10058d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4217,6 +4217,7 @@
 Def_PDict_ZhanlingReward = "ZhanlingReward_%s_%s"  # 战令奖励领取记录,按类型二进制位运算记录是否已领取,参数(类型,key编号)
 Def_PDict_ZhanlingRewardH = "ZhanlingRewardH_%s_%s"  # 高级战令奖励领取记录,按类型二进制位运算记录是否已领取,参数(类型,key编号)
 Def_PDict_ZhanlingRewardFree = "ZhanlingRewardFree_%s_%s"  # 战令免费奖励领取记录,按类型二进制位运算记录是否已领取,参数(类型,key编号)
+Def_PDict_ZhanlingFinishTime = "ZhanlingFinishTime_%s"  # 战令奖励全部领取完毕的时间戳,参数(类型)
 
 #登录活动新
 Def_PDict_ActLoginNewID = "ActLoginNewID_%s"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值,参数:(活动编号)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 944db1d..9e7d65d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -53517,6 +53517,7 @@
     ZhanlingType = 0    #(BYTE ZhanlingType)// 战令类型
     IsActivite = 0    #(BYTE IsActivite)// 普通战令是否已激活
     IsActiviteH = 0    #(BYTE IsActiviteH)// 高级战令是否已激活
+    AllFinishTime = 0    #(DWORD AllFinishTime)// 全部奖励领取完毕的时间戳,未完毕时该值为0,后端会在0点过天时检查可否重置,前端自行做倒计时表现即可
     Value1 = 0    #(DWORD Value1)// 战令对应的自定义值,可选,如登录战令代表开始计算日期时间戳
     RewardCount = 0    #(WORD RewardCount)
     RewardList = list()    #(vector<tagMCZhanling> RewardList)
@@ -53534,6 +53535,7 @@
         self.ZhanlingType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.IsActivite,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.IsActiviteH,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.AllFinishTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.RewardCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
         for i in range(self.RewardCount):
@@ -53550,6 +53552,7 @@
         self.ZhanlingType = 0
         self.IsActivite = 0
         self.IsActiviteH = 0
+        self.AllFinishTime = 0
         self.Value1 = 0
         self.RewardCount = 0
         self.RewardList = list()
@@ -53561,6 +53564,7 @@
         length += 1
         length += 1
         length += 1
+        length += 4
         length += 4
         length += 2
         for i in range(self.RewardCount):
@@ -53574,6 +53578,7 @@
         data = CommFunc.WriteBYTE(data, self.ZhanlingType)
         data = CommFunc.WriteBYTE(data, self.IsActivite)
         data = CommFunc.WriteBYTE(data, self.IsActiviteH)
+        data = CommFunc.WriteDWORD(data, self.AllFinishTime)
         data = CommFunc.WriteDWORD(data, self.Value1)
         data = CommFunc.WriteWORD(data, self.RewardCount)
         for i in range(self.RewardCount):
@@ -53586,6 +53591,7 @@
                                 ZhanlingType:%d,
                                 IsActivite:%d,
                                 IsActiviteH:%d,
+                                AllFinishTime:%d,
                                 Value1:%d,
                                 RewardCount:%d,
                                 RewardList:%s
@@ -53595,6 +53601,7 @@
                                 self.ZhanlingType,
                                 self.IsActivite,
                                 self.IsActiviteH,
+                                self.AllFinishTime,
                                 self.Value1,
                                 self.RewardCount,
                                 "..."
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhanling.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhanling.py
index 9c24f4a..fcee322 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhanling.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhanling.py
@@ -19,6 +19,7 @@
 import PlayerControl
 import PlayerZhanling
 import GameWorld
+import time
 
 #---------------------------------------------------------------------
 #逻辑实现
@@ -34,6 +35,7 @@
         GameWorld.DebugAnswer(curPlayer, "重置奖励: Zhanling 0 类型")
         GameWorld.DebugAnswer(curPlayer, "设置战令: Zhanling 类型 是否激活普通   高级")
         GameWorld.DebugAnswer(curPlayer, "设置进度: Zhanling v 类型  进度值")
+        GameWorld.DebugAnswer(curPlayer, "设置登录: Zhanling d 登录战令已登录天数")
         return
     
     value = msgList[0]
@@ -51,6 +53,14 @@
             GameWorld.DebugAnswer(curPlayer, "该战令不用设置进度值! %s" % (zhanlingType))
             return
         GameWorld.DebugAnswer(curPlayer, "战令进度:Type=%s,V=%s" % (zhanlingType, retValue))
+    elif value == "d":
+        zhanlingType = 5
+        loginDays = msgList[1] if len(msgList) > 1 else 1
+        curTime = int(time.time())
+        firstLoginTime = curTime - (loginDays - 1) * 3600 * 24
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingValue1 % zhanlingType, firstLoginTime)
+        PlayerZhanling.SyncZhanlingInfo(curPlayer, zhanlingType)
+        GameWorld.DebugAnswer(curPlayer, "登录战令已登录天数:%s" % (GameWorld.GetDiff_Day(curTime, firstLoginTime) + 1))
     else:
         zhanlingType = value
         activiteC = msgList[1] if len(msgList) > 1 else 0
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index 58ba0e6..0b8de83 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -125,6 +125,7 @@
 import PlayerFairyDomain
 import CrossPlayerData
 import PlayerTreasure
+import PlayerZhanling
 import PlayerVip
 import PlayerLove
 import PlayerDiceEx
@@ -551,6 +552,8 @@
         
         #投资
         PlayerGoldInvest.OnDay(curPlayer)
+        #战令
+        PlayerZhanling.OnDay(curPlayer)
         #寻宝
         PlayerTreasure.OnDay(curPlayer)
         #法宝
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerZhanling.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerZhanling.py
index 809079f..ad3e140 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerZhanling.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerZhanling.py
@@ -50,6 +50,7 @@
 
 def OnPlayerLogin(curPlayer):
     for zhanlingType in ZhanlingTypeList:
+        CheckZhanlingAllFinish(curPlayer, zhanlingType) # 因为是后面加的功能,为了处理线上玩家及兼容之后可能修改配置等,故上线默认检查一次
         if zhanlingType == ZhanlingType_Login:
             value1 = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingValue1 % zhanlingType)
             if not value1:
@@ -57,6 +58,23 @@
                 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingValue1 % zhanlingType, firstLoginTime)
                 GameWorld.DebugLog("设置登录战令首次登录时间: %s" % firstLoginTime, curPlayer.GetPlayerID())
         SyncZhanlingInfo(curPlayer, zhanlingType)
+    return
+
+def OnDay(curPlayer):
+    resetZhanlingDict = IpyGameDataPY.GetFuncEvalCfg("Zhanling", 4, {})
+    for zhanlingTypeStr, cdDays in resetZhanlingDict.items():
+        zhanlingType = int(zhanlingTypeStr)
+        finishTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingFinishTime % zhanlingType)
+        if not finishTime:
+            GameWorld.DebugLog("战令奖励未全部领取,不重置! zhanlingType=%s" % zhanlingType, curPlayer.GetPlayerID())
+            continue
+        passDays = GameWorld.GetDiff_Day(int(time.time()), finishTime)
+        if passDays < cdDays:
+            GameWorld.DebugLog("战令重置CD天未到,不重置! zhanlingType=%s,passDays=%s < %s, finishTime=%s" 
+                               % (zhanlingType, passDays, cdDays, GameWorld.ChangeTimeNumToStr(finishTime)), curPlayer.GetPlayerID())
+            continue
+        ResetZhanling(curPlayer, int(zhanlingTypeStr))
+        
     return
 
 def OnActiviteByCTGID(curPlayer, ctgID):
@@ -109,6 +127,10 @@
     elif zhanlingType in ZhanlingValue1TypeList:
         backValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingValue1 % zhanlingType)
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingValue1 % zhanlingType, 0)
+    elif zhanlingType == ZhanlingType_Login:
+        firstLoginTime = int(time.time())
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingValue1 % zhanlingType, firstLoginTime)
+        GameWorld.DebugLog("重置登录战令首次登录时间: %s" % firstLoginTime, curPlayer.GetPlayerID())
     GameWorld.Log("重置战令: zhanlingType=%s,backValue=%s,state=(%s to %s) stateH=(%s to %s)" 
                   % (zhanlingType, backValue, state, updState, stateH, updStateH), curPlayer.GetPlayerID())
     
@@ -119,6 +141,8 @@
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingReward % (zhanlingType, keyNum), 0)
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingRewardH % (zhanlingType, keyNum), 0)
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingRewardFree % (zhanlingType, keyNum), 0)
+        
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingFinishTime % zhanlingType, 0)
     SyncZhanlingInfo(curPlayer, zhanlingType)
     return
 
@@ -267,7 +291,39 @@
         ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
     ItemControler.NotifyGiveAwardInfo(curPlayer, itemList, "Zhanling")
     
+    if str(zhanlingType) in IpyGameDataPY.GetFuncEvalCfg("Zhanling", 4, {}):
+        CheckZhanlingAllFinish(curPlayer, zhanlingType)
     return
+
+def CheckZhanlingAllFinish(curPlayer, zhanlingType):
+    ## 判断战令类型是否所有奖励已领取
+    
+    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingFinishTime % zhanlingType):
+        return True
+    
+    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("Zhanling", {"ZhanlingType":zhanlingType}, True)
+    if not ipyDataList:
+        return
+    
+    for ipyData in ipyDataList:
+        rewardIndex = ipyData.GetRewardIndex()
+        
+        if ipyData.GetZLRewardItemListH() and not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ZhanlingRewardH, rewardIndex, True, [zhanlingType]):
+            GameWorld.DebugLog("还有高级战令奖励未领取! zhanlingType=%s,rewardIndex=%s" % (zhanlingType, rewardIndex), curPlayer.GetPlayerID())
+            return
+        
+        if ipyData.GetZLRewardItemList() and not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ZhanlingReward, rewardIndex, True, [zhanlingType]):
+            GameWorld.DebugLog("还有普通战令奖励未领取! zhanlingType=%s,rewardIndex=%s" % (zhanlingType, rewardIndex), curPlayer.GetPlayerID())
+            return
+        
+        if ipyData.GetFreeRewardItemList() and not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ZhanlingRewardFree, rewardIndex, True, [zhanlingType]):
+            GameWorld.DebugLog("还有免费战令奖励未领取! zhanlingType=%s,rewardIndex=%s" % (zhanlingType, rewardIndex), curPlayer.GetPlayerID())
+            return
+        
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingFinishTime % zhanlingType, int(time.time()))
+    SyncZhanlingInfo(curPlayer, zhanlingType)
+    GameWorld.DebugLog("设置战令已全部领取完毕! zhanlingType=%s" % (zhanlingType), curPlayer.GetPlayerID())
+    return True
 
 def SyncZhanlingInfo(curPlayer, zhanlingType, ipyDataList=None):
     
@@ -292,6 +348,7 @@
     clientPack.ZhanlingType = zhanlingType
     clientPack.IsActivite = 1 if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingState)&pow(2, zhanlingType) else 0
     clientPack.IsActiviteH = 1 if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingStateH)&pow(2, zhanlingType) else 0
+    clientPack.AllFinishTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingFinishTime % zhanlingType)
     clientPack.Value1 = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingValue1 % zhanlingType)
     clientPack.RewardList = rewardList
     clientPack.RewardCount = len(clientPack.RewardList)

--
Gitblit v1.8.0