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