From 09f7856ed26cb659933e761f4641f0511b7cab0f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 06 五月 2024 16:21:11 +0800
Subject: [PATCH] 10033 【后端】砍树(回合战斗副本支持任务类型4副本过关、类型12挑战副本;回合副本可重复挑战奖励及首通奖励支持;修复回合战斗NPC不存在时报错bug;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py                 |   16 +------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py                  |    6 --
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                   |   13 +++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                 |   35 +++++++++++++++--
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                        |   13 +++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                          |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py |    3 +
 7 files changed, 58 insertions(+), 29 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index f880c1f..78040d1 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -23873,8 +23873,9 @@
     RecoverCnt = 0    #(WORD RecoverCnt)//找回次数
     ItemAddCnt = 0    #(WORD ItemAddCnt)//物品增加次数
     PassGradeCnt = 0    #(BYTE PassGradeCnt)//星级值对应个数, 每个key存9个lineID
-    PassGrade = list()    #(vector<DWORD> PassGrade)//副本线路对应星级值列表
+    PassGrade = list()    #(vector<DWORD> PassGrade)//副本线路对应星级值列表,一般仅线路有星级设定的才有
     EnterCntTotal = 0    #(DWORD EnterCntTotal)//累计进入次数
+    PassLineID = 0    #(DWORD PassLineID)//已过关到的lineID
     data = None
 
     def __init__(self):
@@ -23892,6 +23893,7 @@
             value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
             self.PassGrade.append(value)
         self.EnterCntTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PassLineID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -23902,6 +23904,7 @@
         self.PassGradeCnt = 0
         self.PassGrade = list()
         self.EnterCntTotal = 0
+        self.PassLineID = 0
         return
 
     def GetLength(self):
@@ -23912,6 +23915,7 @@
         length += 2
         length += 1
         length += 4 * self.PassGradeCnt
+        length += 4
         length += 4
 
         return length
@@ -23926,6 +23930,7 @@
         for i in range(self.PassGradeCnt):
             data = CommFunc.WriteDWORD(data, self.PassGrade[i])
         data = CommFunc.WriteDWORD(data, self.EnterCntTotal)
+        data = CommFunc.WriteDWORD(data, self.PassLineID)
         return data
 
     def OutputString(self):
@@ -23936,7 +23941,8 @@
                                 ItemAddCnt:%d,
                                 PassGradeCnt:%d,
                                 PassGrade:%s,
-                                EnterCntTotal:%d
+                                EnterCntTotal:%d,
+                                PassLineID:%d
                                 '''\
                                 %(
                                 self.FBID,
@@ -23945,7 +23951,8 @@
                                 self.ItemAddCnt,
                                 self.PassGradeCnt,
                                 "...",
-                                self.EnterCntTotal
+                                self.EnterCntTotal,
+                                self.PassLineID
                                 )
         return DumpString
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
index 4eb4384..828d3f5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -36,6 +36,8 @@
 import ItemControler
 import PassiveBuffEffMng
 import FBLogic
+import ShareDefine
+import PlayerTask
 
 # 回合战斗流程状态
 (
@@ -85,6 +87,12 @@
     if tagPlayerID:
         if playerID == tagPlayerID:
             GameWorld.DebugLog("不能打自己!", playerID)
+            return
+        
+    fbIpyData = FBCommon.GetFBIpyData(mapID)
+    fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, funcLineID)
+    if fbIpyData or fbLineIpyData:
+        if FBCommon.CheckCanEnterFBComm(curPlayer, mapID, funcLineID, fbIpyData, fbLineIpyData) != ShareDefine.EntFBAskRet_OK:
             return
         
     if not FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList):
@@ -180,15 +188,24 @@
     if overRet != None:
         needSendGameServer, awardItemList, awardWay = overRet
         
-    if isWin and ipyData:
+    isFirstPass = None
+    if isWin and ipyData:    
+        passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
+        if funcLineID == passLineID + 1:
+            isFirstPass = True
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID)
+            FBCommon.Sync_FBPlayerFBInfoData(curPlayer, mapID)
+        else:
+            isFirstPass = False
+            
         if awardWay == 1 and not awardItemList:
             # 山寨测试先默认都是首次奖励,正式后需删除
-            awardItemList = ipyData.GetAwardItemListFirst()
+            awardItemList = ipyData.GetAwardItemListFirst() if isFirstPass else ipyData.GetAwardItemList()
             
     if awardItemList == None:
         awardItemList = []
         
-    GameWorld.DebugLog("奖励物品: %s" % awardItemList)
+    GameWorld.DebugLog("奖励物品: %s, isFirstPass=%s" % (awardItemList, isFirstPass))
     if awardWay == 1 and awardItemList:
         ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}])
         
@@ -198,6 +215,11 @@
     overMsg = {"isWin":isWin, "itemInfo":FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)}
     playbackID and overMsg.update({"playbackID":playbackID})
     SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Award, turnNum, turnMax, overMsg)
+    
+    # 其他...
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBChallenge, 1, [mapID])
+    if isWin:
+        PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass)
     return
 
 def GetPlayerFactionInfoByCache(playerID):
@@ -238,9 +260,12 @@
     factionA, factionB, mainRolePlace = 1, 2, 1
     objRetA = __SummonFactionObjs(factionA, mainRolePlace, factionInfoA, sightLevel, posX, posY)
     objRetB = __SummonFactionObjs(factionB, mainRolePlace, factionInfoB, sightLevel, posX, posY)
-    objA, petObjListA, factionSyncInfoA = objRetA if objRetA else (None, [])
-    objB, petObjListB, factionSyncInfoB = objRetB if objRetB else (None, [])
+    objA, petObjListA, factionSyncInfoA = objRetA if objRetA else (None, [], {})
+    objB, petObjListB, factionSyncInfoB = objRetB if objRetB else (None, [], {})
     if not objA or not objB:
+        fightObjList = petObjListA + [objA] + petObjListB + [objB]
+        for gameObj in fightObjList:
+            TurnFightObjOverReset(gameObj, tick)
         return
     playerIDA = objA.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) # 可能为0,非玩家镜像时为0
     playerIDB = objB.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) # 可能为0,非玩家镜像时为0
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index a9b7ef5..f05460c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3584,6 +3584,7 @@
 Def_Player_Dict_ReqFBMissionType = "ReqFBMissionType" # 请求进入副本的任务类型
 Def_Player_Dict_PlayerFBStar_MapId = "FBStar_%s_%s"  # 副本星级星级信息, 参数为[mapID, key编号], 按位存储每个lineID对应的星级
 Def_Player_Dict_CustomMapStep = "CustomMapStep_%s_%s"  # 前端自定义场景阶段, 参数(mapID, lineID),对应 CustomMapStep_Fight ...
+Def_Player_Dict_FBPassLineID = "FBPassLineID_%s"  # 副本已过关到的lineID, 参数为副本ID
 Def_Player_Dict_EnterFbCntTotal = "EnterFbCntTotal_%s"  # 进入副本总累计次数, 参数为副本ID
 Def_Player_Dict_EnterFbCntDay = "EnterFbCntDay_%s"  # 今日进入副本次数, 参数为副本ID
 Def_Player_Dict_BuyFbCntDay = "BuyFbCntDay_%s" # 今日购买副本进入次数, 参数为副本ID
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index f880c1f..78040d1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -23873,8 +23873,9 @@
     RecoverCnt = 0    #(WORD RecoverCnt)//找回次数
     ItemAddCnt = 0    #(WORD ItemAddCnt)//物品增加次数
     PassGradeCnt = 0    #(BYTE PassGradeCnt)//星级值对应个数, 每个key存9个lineID
-    PassGrade = list()    #(vector<DWORD> PassGrade)//副本线路对应星级值列表
+    PassGrade = list()    #(vector<DWORD> PassGrade)//副本线路对应星级值列表,一般仅线路有星级设定的才有
     EnterCntTotal = 0    #(DWORD EnterCntTotal)//累计进入次数
+    PassLineID = 0    #(DWORD PassLineID)//已过关到的lineID
     data = None
 
     def __init__(self):
@@ -23892,6 +23893,7 @@
             value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
             self.PassGrade.append(value)
         self.EnterCntTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PassLineID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -23902,6 +23904,7 @@
         self.PassGradeCnt = 0
         self.PassGrade = list()
         self.EnterCntTotal = 0
+        self.PassLineID = 0
         return
 
     def GetLength(self):
@@ -23912,6 +23915,7 @@
         length += 2
         length += 1
         length += 4 * self.PassGradeCnt
+        length += 4
         length += 4
 
         return length
@@ -23926,6 +23930,7 @@
         for i in range(self.PassGradeCnt):
             data = CommFunc.WriteDWORD(data, self.PassGrade[i])
         data = CommFunc.WriteDWORD(data, self.EnterCntTotal)
+        data = CommFunc.WriteDWORD(data, self.PassLineID)
         return data
 
     def OutputString(self):
@@ -23936,7 +23941,8 @@
                                 ItemAddCnt:%d,
                                 PassGradeCnt:%d,
                                 PassGrade:%s,
-                                EnterCntTotal:%d
+                                EnterCntTotal:%d,
+                                PassLineID:%d
                                 '''\
                                 %(
                                 self.FBID,
@@ -23945,7 +23951,8 @@
                                 self.ItemAddCnt,
                                 self.PassGradeCnt,
                                 "...",
-                                self.EnterCntTotal
+                                self.EnterCntTotal,
+                                self.PassLineID
                                 )
         return DumpString
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py
index ea9f48c..a071cfb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Task.py
@@ -30,8 +30,8 @@
     
     if len(paramList) == 0:
         GameWorld.DebugAnswer(curPlayer, "重置主线: Task 0")
-        GameWorld.DebugAnswer(curPlayer, "输出任务: Task 1")
         GameWorld.DebugAnswer(curPlayer, "设置任务: Task 任务ID 进度")
+        __ShowTask(curPlayer)
         return
     
     taskID = paramList[0]
@@ -42,10 +42,6 @@
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, 0)
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, 0)
         PlayerTask.__giveNewTask(curPlayer, taskGroup)
-        return
-    
-    if len(paramList) == 1 and paramList[0] == 1:
-        __ShowTask(curPlayer)
         return
     
     taskValue = paramList[1] if len(paramList) > 1 else 0
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
index f4dc653..ca6d134 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -122,6 +122,8 @@
     if not fbLineIpyData and isDefaultLine:
         #GameWorld.DebugLog("没有指定功能线路的则默认取0,再没有的话就是不需要的mapID=%s, lineID=%s" % (mapID, lineID))
         fbLineIpyData = IpyGameDataPY.GetIpyGameDataNotLog("FBLine", mapID, 0)
+        if not fbLineIpyData:
+            fbLineIpyData = IpyGameDataPY.GetIpyGameDataNotLog("FBLine", mapID, 1) # 有些从1开始,如爬塔类
     return fbLineIpyData
 
 def GetFBLineEnterPosInfo(mapID, lineID, fbLineIpyData=None):
@@ -2425,6 +2427,7 @@
         mapInfo.EnterCntTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntTotal % mID)
         mapInfo.RecoverCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RecoverFbCnt % mID)
         mapInfo.ItemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ItemAddFbCnt % mID)
+        mapInfo.PassLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mID)
         
         for keyNum in range(ChConfig.Def_FBStar_MaxKeyCnt):
             gradeValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PlayerFBStar_MapId % (mID, keyNum))
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py
index d06a415..e0241f6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTask.py
@@ -149,8 +149,8 @@
         if len(conds) != 2:
             return 0
         mapID, lineID = conds
-        grade = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
-        taskValue = 1 if grade > 0 else 0
+        passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
+        taskValue = 1 if passLineID >= lineID else 0
         
     elif taskType == ChConfig.TaskType_EquipColorItem:
         if not conds:
@@ -217,18 +217,8 @@
     ## 检查任务条件是否满足
     taskType = ipyData.GetTaskType()
     
-    # 副本xxx过关
-    if taskType == ChConfig.TaskType_FBPass:
-        taskConds = ipyData.GetTaskConds()
-        if not conds or len(conds) != len(taskConds) or len(conds) < 2:
-            return
-        if conds[0] != taskConds[0]:
-            return
-        if conds[1] < taskConds[1]:
-            return
-        
     # 副本xxx挑战
-    elif taskType == ChConfig.TaskType_FBChallenge:
+    if taskType == ChConfig.TaskType_FBChallenge:
         taskConds = ipyData.GetTaskConds()
         if not conds or len(conds) != len(taskConds) or len(conds) < 1:
             return

--
Gitblit v1.8.0