From 0f213f3a4408bdc48e3017b4f10bf07834a54097 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 14 五月 2024 10:57:14 +0800
Subject: [PATCH] 10156 副本功能玩法关联回合战斗表现(个人boss改为回合战斗,奖励改为固定产出,区分首次击杀跟扫荡奖励;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                                   |    6 +
 PySysDB/PySysDBPY.h                                                                                                    |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_PersonalBoss.py |  184 ++++++++++++++++++---------------------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py               |   16 ++-
 4 files changed, 91 insertions(+), 117 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 68e47cd..3a98ca9 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1342,6 +1342,8 @@
 {
 	DWORD		NPCID;	//ID
 	DWORD		_FuncLineID;	//可挑战等级
+	list		FirstAwardItemList;	//首杀奖励列表[[物品ID,个数,是否拍品], ...]
+	list		SweepAwardItemList;	//扫荡奖励列表[[物品ID,个数,是否拍品], ...]
 };
 
 //仙盟活跃表
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 eb91027..8ba0491 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
@@ -1720,21 +1720,23 @@
     NotifyFBCntRegainInfo(curPlayer, [mapID])
     return
 
-def OnFBJoin(curPlayer, mapID, funcLineID):
+def OnFBJoin(curPlayer, mapID, funcLineID, joinCount=1):
     ## 副本参与通用逻辑
-    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBChallenge, 1, [mapID])
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBChallenge, joinCount, [mapID])
     return
 
-def OnFBPass(curPlayer, mapID, funcLineID, awardItemList=None):
+def OnFBPass(curPlayer, mapID, funcLineID, awardItemList=None, passCount=1):
     ## 副本过关通用逻辑
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID)
-    Sync_FBPlayerFBInfoData(curPlayer, mapID)
-    
+    passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
+    if funcLineID > passLineID:
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID)
+        Sync_FBPlayerFBInfoData(curPlayer, mapID)
+        PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass)
+        
     if awardItemList:
         GameWorld.DebugLog("给奖励物品: %s" % awardItemList)
         ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["FBPass_%s" % mapID, False, {"mapID":mapID, "funcLineID":funcLineID}])
         
-    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass)
     return
 
 def RegainFBCntProcess(curPlayer):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_PersonalBoss.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_PersonalBoss.py
index d926dfc..76ad1cb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_PersonalBoss.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_PersonalBoss.py
@@ -18,117 +18,70 @@
 
 import FBCommon
 import GameWorld
-import EventReport
 import PlayerBossReborn
 import PlayerNewFairyCeremony
 import PlayerActGarbageSorting
 import PlayerFairyCeremony
 import PlayerFeastTravel
 import IpyGameDataPY
-import EventShell
-import NPCCommon
 import ChConfig
 
-## 是否能够通过活动查询进入
-def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
-    return True
-
-## 是否需要做进入副本通用检查条件逻辑,默认需要检查
-def OnNeedCheckCanEnterFBComm(curPlayer, mapID, lineID):
-    ## 进行中的不需要重复检查,防止断线重连被禁止进入
-    if FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) == ChConfig.CustomMapStep_Fight:
-        GameWorld.DebugLog("VIPBoss已经在进行中,本次进入不需要重新检查!")
-        return False
-    return True
-
-## 客户端进入自定义场景
-def OnEnterCustomScene(curPlayer, mapID, lineID):
+def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
+    ## 回合战斗请求 - 地图验证
     
-    return
-
-## 判断可否召唤木桩怪
-def OnCanSummonPriWoodPile(curPlayer, mapID, lineID, npcID, count):
-    
-    if FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) != ChConfig.CustomMapStep_Fight:
-        FBCommon.SetCustomMapStep(curPlayer, mapID, lineID, ChConfig.CustomMapStep_Fight)
-        EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_PersonalBoss, 0, ChConfig.CME_Log_Start)
-        
-        # 开始计时
-        tick = GameWorld.GetGameWorld().GetTick()
-        curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneStepTick, tick)
-        FBCommon.UpdateCustomFBGrade(curPlayer, tick, FBCommon.GetFBLineGrade(mapID, lineID))
-        
-    return True
-
-def OnCustomSceneProcess(curPlayer, mapID, lineID, tick):
-    
-    if FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) == ChConfig.CustomMapStep_Fight:
-        FBCommon.UpdateCustomFBGrade(curPlayer, tick, FBCommon.GetFBLineGrade(mapID, lineID))
-        
-    return
-
-## 自定义场景副本击杀NPC
-def DoCustomScene_Player_KillNPC(curPlayer, curNPC, mapID, lineID):
-    
-    npcID = curNPC.GetNPCID()
-    bossID = __GetPersonalBossID(lineID)
-    GameWorld.DebugLog("个人boss场景击杀NPC: npcID=%s,bossID=%s" % (npcID, bossID), curPlayer.GetPlayerID())
-    if npcID != bossID:
+    # 只能一关关挑战
+    passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
+    if funcLineID != passLineID + 1:
+        GameWorld.ErrLog("只能挑战下一关! mapID=%s,funcLineID=%s,passLineID=%s,nextLineID=%s" 
+                         % (mapID, funcLineID, passLineID, passLineID + 1), curPlayer.GetPlayerID())
         return
     
-    if FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) != ChConfig.CustomMapStep_Fight:
+    ipyData = IpyGameDataPY.GetIpyGameData("PersonalBoss", funcLineID)
+    if not ipyData:
         return
     
-    grade = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomSceneGrade)
-    costTime = GameWorld.GetGameWorld().GetTick() - curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomSceneStepTick)
-    GameWorld.DebugLog("个人boss过关: grade=%s,costTime=%s" % (grade, costTime))
-    isFree = False
-    curfbStar = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
-    # 首次过关不扣次数
-    if not curfbStar:
-        isFree = True
-        GameWorld.DebugLog("    首次过关!mapID=%s,lineID=%s" % (mapID, lineID), curPlayer.GetPlayerID())
+    bossID = ipyData.GetNPCID()
+    if tagID != bossID or tagType != ChConfig.TurnBattle_TagType_NPC:
+        GameWorld.ErrLog("目标bossID错误,无法挑战! mapID=%s,funcLineID=%s,bossID=%s,tagType=%s,tagID=%s" 
+                         % (mapID, funcLineID, bossID, tagType, tagID), curPlayer.GetPlayerID())
+        return
+    
+    return True
+
+def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
+    ## 回合战斗结束
+    # @return: 是否需要同步GameServer, 奖励列表, 同步结果信息
+    needSendGameServer = False
+    overInfoEx = {}
+    isWin = fightRet[0]
+    
+    GameWorld.DebugLog("副本结算: mapID=%s,funcLineID=%s,isWin=%s" % (mapID, funcLineID, isWin))
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("PersonalBoss", funcLineID)
+    if not ipyData:
+        return
+    
+    OnFBJoin(curPlayer, mapID, funcLineID)
+    
+    if not isWin:
+        return
+    awardItemList = ipyData.GetFirstAwardItemList()
         
-    if curfbStar < grade:
-        GameWorld.DebugLog("    更新评级!curfbStar=%s < grade=%s" % (curfbStar, grade), curPlayer.GetPlayerID())
-        GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, grade, False, [mapID])
-        FBCommon.Sync_FBPlayerFBInfoData(curPlayer, mapID) # 同步信息
-        
+    isFree = True
     #增加进入次数
     FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_PersonalBoss, isFree=isFree)
     
-    FBCommon.DelFBEnterTicket(curPlayer, ChConfig.Def_FBMapID_PersonalBoss)
-    PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_VIPBOSS, 1)
-    PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_VIPBoss, 1)
-    PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_VIPBoss, 1)
-    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_VIPBoss, 1)
-    PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_KillBoss)
-    
-    EventShell.EventRespons_FBEvent(curPlayer, 'passvipboss')
-    
-    npcCountDict = {bossID:1}
-    dropItemMapInfo = [0, 0]
-    jsonItemList = NPCCommon.GiveKillNPCDropPrize(curPlayer, mapID, npcCountDict, dropItemMapInfo=dropItemMapInfo, curGrade=grade, isVirtualDrop=True)[0]
-    FBCommon.SetCustomMapStep(curPlayer, mapID, lineID, ChConfig.CustomMapStep_Over)
-    isPass = 1
-    overDict = {FBCommon.Over_itemInfo:jsonItemList, FBCommon.Over_grade:grade, FBCommon.Over_costTime:costTime}
-    FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)
-    return
-
-def __GetPersonalBossID(lineID):
-    ## VIPbossID
-    ipyData = IpyGameDataPY.GetIpyGameData('PersonalBoss', lineID)
-    if not ipyData:
-        return 0
-    return ipyData.GetNPCID()
+    #设置星级,兼容就逻辑
+    grade = 5
+    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, funcLineID, grade, False, [mapID])
+    OnFBPass(curPlayer, mapID, funcLineID, awardItemList)
+    return needSendGameServer, awardItemList, overInfoEx
 
 ## 可否扫荡
 def OnPlayerFBSweepAsk(curPlayer, mapID, lineID, sweepCnt, isFinish, dataEx):
-    if mapID != ChConfig.Def_FBMapID_PersonalBoss:
-        return
-    curGrade = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
-    if curGrade < 5:
-        GameWorld.DebugLog("没有S级不能扫荡! curGrade=%s" % curGrade)
+    passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
+    if passLineID < lineID:
+        GameWorld.DebugLog("未击杀不能扫荡! mapID=%s,lineID=%s > passLineID(%s)" % (mapID, lineID, passLineID))
         return
     
     return True
@@ -136,25 +89,38 @@
 ## 扫荡结果
 def OnPlayerFBSweepResult(curPlayer, mapID, lineID, sweepCnt, isFinish, dataEx):
     
-    bossID = __GetPersonalBossID(lineID)
-    grade = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
+    GameWorld.DebugLog("扫荡: mapID=%s,lineID=%s,sweepCnt=%s" % (mapID, lineID, sweepCnt), curPlayer.GetPlayerID())
+    ipyData = IpyGameDataPY.GetIpyGameData("PersonalBoss", lineID)
+    if not ipyData:
+        return
     
-    GameWorld.DebugLog("个人boss扫荡: lineID=%s,bossID=%s,grade=%s,sweepCnt=%s" 
-                       % (lineID, bossID, grade, sweepCnt), curPlayer.GetPlayerID())
-    
-    PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_VIPBOSS, sweepCnt)
-    PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_VIPBoss, sweepCnt)
-    PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_VIPBoss, sweepCnt)
-    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_VIPBoss, sweepCnt)
-    PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_KillBoss)
-    
-    EventShell.EventRespons_FBEvent(curPlayer, 'passvipboss')
-    
-    npcCountDict = {bossID:sweepCnt}
-    jsonItemList = NPCCommon.GiveKillNPCDropPrize(curPlayer, mapID, npcCountDict, curGrade=grade)[0]
-    isPass = 1
-    overDict = {FBCommon.Over_itemInfo:jsonItemList, FBCommon.Over_isSweep:1}
-    FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)
+    awardItemList = []
+    for itemID, itemCount, isAuctionItem in ipyData.GetSweepAwardItemList():
+        awardItemList.append([itemID, itemCount * sweepCnt, isAuctionItem])
+        
+    OnFBJoin(curPlayer, mapID, lineID, sweepCnt)
+    OnFBPass(curPlayer, mapID, lineID, awardItemList, sweepCnt, True)
     return True
 
+def OnFBJoin(curPlayer, mapID, funcLineID, joinCount=1):
+    ## 副本参与
+    FBCommon.OnFBJoin(curPlayer, mapID, funcLineID, joinCount)
+    return
+
+def OnFBPass(curPlayer, mapID, funcLineID, awardItemList=None, passCount=1, isSweep=False):
+    ## 副本过关
+    FBCommon.OnFBPass(curPlayer, mapID, funcLineID, awardItemList, passCount)
+    
+    PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_VIPBOSS, passCount)
+    PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_VIPBoss, passCount)
+    PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_VIPBoss, passCount)
+    PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_VIPBoss, passCount)
+    PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_KillBoss, passCount)
+    
+    isPass = 1
+    overDict = {FBCommon.Over_itemInfo:awardItemList}
+    if isSweep:
+        overDict.update({FBCommon.Over_isSweep:1})
+    FBCommon.NotifyFBOver(curPlayer, mapID, funcLineID, isPass, overDict)
+    return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 4517f08..80a2fd5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1097,6 +1097,8 @@
                 "PersonalBoss":(
                         ("DWORD", "NPCID", 0),
                         ("DWORD", "FuncLineID", 1),
+                        ("list", "FirstAwardItemList", 0),
+                        ("list", "SweepAwardItemList", 0),
                         ),
 
                 "FamilyActivity":(
@@ -3801,7 +3803,9 @@
         return
         
     def GetNPCID(self): return self.attrTuple[0] # ID DWORD
-    def GetFuncLineID(self): return self.attrTuple[1] # 可挑战等级 DWORD
+    def GetFuncLineID(self): return self.attrTuple[1] # 可挑战等级 DWORD
+    def GetFirstAwardItemList(self): return self.attrTuple[2] # 首杀奖励列表[[物品ID,个数,是否拍品], ...] list
+    def GetSweepAwardItemList(self): return self.attrTuple[3] # 扫荡奖励列表[[物品ID,个数,是否拍品], ...] list
 
 # 仙盟活跃表
 class IPY_FamilyActivity():

--
Gitblit v1.8.0