From baf4ee227536731ef58efa186d3b23924d9d2729 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 27 十一月 2025 15:39:36 +0800
Subject: [PATCH] 349 【配套功能】功能预告-服务端(功能开启增加主线关卡进度条件)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py        |   35 ++---------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py |   53 +++++++++++++++++++++++---
 PySysDB/PySysDBPY.h                                                                         |   12 -----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py  |    4 ++
 4 files changed, 55 insertions(+), 49 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 6380398..b480d82 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -557,6 +557,7 @@
 	WORD		LimiRealmLV;	//需要境界等级
 	DWORD		LimitMissionID;	//需要完成的任务ID
 	WORD		LimitOpenDay;	//开服第几天开启
+	WORD		LimitManLevel;	//关卡进度波
 	char		MailKey;	//邮件
 	list		AwardList;	//奖励列表[[物品ID,个数], ...]
 };
@@ -1452,17 +1453,6 @@
 {
 	BYTE		_DayID;	//天数
 	dict		Reward;	//奖励 {"职业":[[物品ID,个数],...], ...}
-};
-
-//七天限时特惠表
-
-struct tagSpringSale
-{
-	BYTE		_GiftID;	//礼包ID
-	BYTE		SellDay;	//创角第几天上架
-	BYTE		BuyNumLimit;	//每人限购数量
-	WORD		GiftPrice;	//礼包价格,仙玉
-	list		GiftItemList;	//礼包物品信息列表[[物品ID,个数,是否绑定], ...]
 };
 
 //充值商品编号表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py
index a61efa6..feef973 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/OpenFunc.py
@@ -89,10 +89,10 @@
         openFuncIDList = [openFuncID]
         
     if openFuncIDList:
-        needLV, needRealmLV, needMissionIDList = __GetOpenFuncLimit(curPlayer, openFuncIDList)
+        needLV, needRealmLV, needMissionIDList, needMainLevel = __GetOpenFuncLimit(curPlayer, openFuncIDList)
         if needRealmLV:
             openFuncIDList.append(ShareDefine.GameFuncID_Official)
-    needLV, needRealmLV, needMissionIDList = __GetOpenFuncLimit(curPlayer, openFuncIDList)
+    needLV, needRealmLV, needMissionIDList, needMainLevel = __GetOpenFuncLimit(curPlayer, openFuncIDList)
     
     GameWorld.DebugLog("GM处理等级开启功能: openFuncID=%s,openFuncIDList=%s,needLV=%s" % (openFuncID, openFuncIDList, needLV), curPlayer.GetPlayerID())
     
@@ -121,7 +121,9 @@
         if not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_MissionFinish % limitMissionID):
             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % limitMissionID, 1)
             
-    GameWorld.DebugLog("GM处理任务开启功能: needMissionIDList=%s" % needMissionIDList, curPlayer.GetPlayerID())
+    if needMainLevel:
+        PlayerControl.SetMainLevelPassValue(curPlayer, needMainLevel)
+    GameWorld.DebugLog("GM处理任务开启功能: needMissionIDList=%s,needMainLevel=%s" % (needMissionIDList, needMainLevel), curPlayer.GetPlayerID())
     #最后强制触发一次
     GameFuncComm.DoFuncOpenLogic(curPlayer, checkServerDay=False)
     return
@@ -131,6 +133,7 @@
     needLV = 0
     needRealmLV = 0
     needMissionIDList = []
+    needMainLevel = 0
     
     ipyDataMgr = IpyGameDataPY.IPY_Data()
     funcOpenLVCount = ipyDataMgr.GetFuncOpenLVCount()
@@ -151,7 +154,12 @@
         limitMissionID = ipyData.GetLimitMissionID()
         if limitMissionID and limitMissionID not in needMissionIDList:
             needMissionIDList.append(limitMissionID)
-    return needLV, needRealmLV, needMissionIDList
+            
+        limitManLevel = ipyData.GetLimitManLevel()
+        if limitManLevel and needMainLevel < limitManLevel:
+            needMainLevel = limitManLevel
+            
+    return needLV, needRealmLV, needMissionIDList, needMainLevel
 
 def DoGMCloseFunc(curPlayer, closeFuncID):
     ## GM关闭功能
@@ -163,10 +171,13 @@
             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch % keyNum, 0)
             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GameFuncAwardState % keyNum, 0)
             
-        needLV, needRealmLV, needMissionIDList = __GetOpenFuncLimit(curPlayer, [])
+        needLV, needRealmLV, needMissionIDList, needMainLevel = __GetOpenFuncLimit(curPlayer, [])
         for missionID in needMissionIDList:
             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % missionID, 0)
-        
+            
+        if needMainLevel:
+            PlayerControl.SetMainLevelPassInfo(curPlayer, 1, 1, 0)
+            
         GameFuncComm.Sync_FuncOpenState(curPlayer, isSyncUnOpen=True)
         GameWorld.DebugAnswer(curPlayer, "关闭所有功能!")
         return
@@ -191,8 +202,36 @@
     limitMissionID = ipyData.GetLimitMissionID()
     if limitMissionID:
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % limitMissionID, 0)
-            
+        
+    limitManLevel = ipyData.GetLimitManLevel()
+    if limitManLevel and PlayerControl.GetMainLevelPassValue(curPlayer) >= limitManLevel:
+        __SetPassMainLevelWavePre(curPlayer)
+        
     GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, closeFuncID, 0)
     GameFuncComm.Sync_FuncOpenState(curPlayer, isSyncUnOpen=True)
     GameWorld.DebugAnswer(curPlayer, "关闭功能: %s" % closeFuncID)
     return
+
+def __SetPassMainLevelWavePre(curPlayer):
+    ## 设置已过关主线进度到上一波
+    passChapterID, passLevelNum, passWave = PlayerControl.GetMainLevelPassInfo(curPlayer) # 当前过关进度包含波,所以需要取上一关的
+    if passWave > 0:
+        passWave -= 1
+        PlayerControl.SetMainLevelPassInfo(curPlayer, passChapterID, passLevelNum, passWave)
+        return
+    
+    passWave = 0
+    if passLevelNum > 1:
+        passLevelNum -= 1
+        PlayerControl.SetMainLevelPassInfo(curPlayer, passChapterID, passLevelNum, passWave)
+        return
+    
+    if passChapterID > 1: # 取上一章节
+        passChapterID -= 1
+        levelDataList = IpyGameDataPY.GetIpyGameDataByCondition("MainLevel", {"ChapterID":passChapterID}, True)
+        passLevelNum = len(levelDataList) if levelDataList else 0
+        PlayerControl.SetMainLevelPassInfo(curPlayer, passChapterID, passLevelNum, passWave)
+        return
+    
+    PlayerControl.SetMainLevelPassInfo(curPlayer, 1, 1, 0)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 28fa30a..1d2c9da 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -500,6 +500,7 @@
                         ("WORD", "LimiRealmLV", 0),
                         ("DWORD", "LimitMissionID", 0),
                         ("WORD", "LimitOpenDay", 0),
+                        ("WORD", "LimitManLevel", 0),
                         ("char", "MailKey", 0),
                         ("list", "AwardList", 0),
                         ),
@@ -1180,14 +1181,6 @@
                 "LoginDayAward":(
                         ("BYTE", "DayID", 1),
                         ("dict", "Reward", 0),
-                        ),
-
-                "SpringSale":(
-                        ("BYTE", "GiftID", 1),
-                        ("BYTE", "SellDay", 0),
-                        ("BYTE", "BuyNumLimit", 0),
-                        ("WORD", "GiftPrice", 0),
-                        ("list", "GiftItemList", 0),
                         ),
 
                 "OrderInfo":(
@@ -2880,8 +2873,9 @@
     def GetLimiRealmLV(self): return self.attrTuple[2] # 需要境界等级 WORD
     def GetLimitMissionID(self): return self.attrTuple[3] # 需要完成的任务ID DWORD
     def GetLimitOpenDay(self): return self.attrTuple[4] # 开服第几天开启 WORD
-    def GetMailKey(self): return self.attrTuple[5] # 邮件 char
-    def GetAwardList(self): return self.attrTuple[6] # 奖励列表[[物品ID,个数], ...] list
+    def GetLimitManLevel(self): return self.attrTuple[5] # 关卡进度波 WORD
+    def GetMailKey(self): return self.attrTuple[6] # 邮件 char
+    def GetAwardList(self): return self.attrTuple[7] # 奖励列表[[物品ID,个数], ...] list
 
 # 合成表
 class IPY_ItemCompound():
@@ -3905,19 +3899,6 @@
         
     def GetDayID(self): return self.attrTuple[0] # 天数 BYTE
     def GetReward(self): return self.attrTuple[1] # 奖励 {"职业":[[物品ID,个数],...], ...} dict
-
-# 七天限时特惠表
-class IPY_SpringSale():
-    
-    def __init__(self):
-        self.attrTuple = None
-        return
-        
-    def GetGiftID(self): return self.attrTuple[0] # 礼包ID BYTE
-    def GetSellDay(self): return self.attrTuple[1] # 创角第几天上架 BYTE
-    def GetBuyNumLimit(self): return self.attrTuple[2] # 每人限购数量 BYTE
-    def GetGiftPrice(self): return self.attrTuple[3] # 礼包价格,仙玉 WORD
-    def GetGiftItemList(self): return self.attrTuple[4] # 礼包物品信息列表[[物品ID,个数,是否绑定], ...] list
 
 # 充值商品编号表
 class IPY_OrderInfo():
@@ -5698,7 +5679,6 @@
         self.__LoadFileData("ChestsAward", onlyCheck)
         self.__LoadFileData("VIPKillNPC", onlyCheck)
         self.__LoadFileData("LoginDayAward", onlyCheck)
-        self.__LoadFileData("SpringSale", onlyCheck)
         self.__LoadFileData("OrderInfo", onlyCheck)
         self.__LoadFileData("CTG", onlyCheck)
         self.__LoadFileData("CTGSelectItem", onlyCheck)
@@ -6782,13 +6762,6 @@
     def GetLoginDayAwardByIndex(self, index):
         self.CheckLoadData("LoginDayAward")
         return self.ipyLoginDayAwardCache[index]
-
-    def GetSpringSaleCount(self):
-        self.CheckLoadData("SpringSale")
-        return self.ipySpringSaleLen
-    def GetSpringSaleByIndex(self, index):
-        self.CheckLoadData("SpringSale")
-        return self.ipySpringSaleCache[index]
 
     def GetOrderInfoCount(self):
         self.CheckLoadData("OrderInfo")
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
index e88407c..0c8172e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
@@ -90,6 +90,10 @@
         if limitOpenDay and serverDay < limitOpenDay and checkServerDay:
             continue
         
+        limitManLevel = ipyData.GetLimitManLevel()
+        if limitManLevel and limitManLevel < PlayerControl.GetMainLevelPassValue(curPlayer):
+            continue
+        
         # 先更新值再处理开启逻辑,不能可能导致在功能开启逻辑中再开启功能引发的递归死循环
         befValue, updValue = GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, funcID, 1)
         if befValue == updValue:

--
Gitblit v1.8.0