From e81315f997d75f900727af1c456c32277575fb24 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 10 七月 2025 17:01:18 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(主线掉落战利品、装备;主线击杀怪物获得经验、升级;主线装备穿戴、分解;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py |  116 +++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 82 insertions(+), 34 deletions(-)

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 6520bac..0311541 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,7 @@
 import SkillCommon
 import SkillShell
 import AttackCommon
+import FBLogic
 
 import random
 import time
@@ -236,6 +237,9 @@
         
         self.startTime = 0 # 开始时间戳,支持毫秒小数
         self.costTime = 0 # 单场战斗总耗时,支持毫秒小数
+        
+        #玩家武将行动后击杀目标
+        self.playerKillObjIDList = [] # [objID, ...]
         return
     
     def setTurn(self, mapID, funcLineID, turnMax, isNeedReport=False, msgDict={}):
@@ -998,8 +1002,7 @@
     overLineupList = [] # 本回合已经结束行动的阵容列表 [(faction, num), ...], 所有阵容全部结束代表本回合结束
     
     turnNum = turnFight.turnNum
-    unXiantaoCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCnt)
-    GameWorld.DebugLog("unXiantaoCnt=%s,turnNum=%s,doMax=%s,actionIndex=%s,%s" % (unXiantaoCnt, turnNum, doMax, turnFight.actionIndex, turnFight.actionSortList))
+    GameWorld.DebugLog("turnNum=%s,doMax=%s,actionIndex=%s,%s" % (turnNum, doMax, turnFight.actionIndex, turnFight.actionSortList))
     while doCnt < doMax and len(overLineupList) < len(turnFight.actionSortList):
         doCnt += 1
         turnNum = turnFight.turnNum
@@ -1022,6 +1025,7 @@
         if turnFight.actionIndex >= len(turnFight.actionSortList):
             turnFight.actionIndex = 0
             
+        playerHeroAtk = False # 玩家阵容行动标记
         faction, num = turnFight.actionSortList[turnFight.actionIndex]
         batFaction = turnFight.getBatFaction(faction)
         batLineup = batFaction.getBatlineup(num)
@@ -1068,8 +1072,8 @@
                     continue
                 
                 if faction == Def_FactionA:
-                    if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_Xiantao, fightPoint, isNotify=False):
-                        return
+                    playerHeroAtk = True
+                    
                 break
             
         turnFight.actionIndex += 1
@@ -1082,10 +1086,9 @@
         if turnFight.checkOverByKilled():
             break
         
-        nowUnXiantaoCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCnt)
-        if unXiantaoCnt != nowUnXiantaoCnt:
-            # 玩家有消耗战锤则停止,一段段执行
-            GameWorld.DebugLog("玩家有消耗战锤则停止,nowUnXiantaoCnt=%s" % (nowUnXiantaoCnt))
+        if playerHeroAtk:
+            # 玩家武将有行动则停止,一段段执行
+            GameWorld.DebugLog("玩家武将有行动则停止!")
             break
         
     if turnFight.winFaction:
@@ -1340,23 +1343,10 @@
         GameWorld.DebugLog("        自残: curTD=%s,tagID=%s,skillID=%s,hurtType=%s,hurtValue=%s,lostHP=%s,curHP=%s" 
                            % (curID, tagID, skillID, hurtType, hurtValue, lostHP, GameObj.GetHP(curObj)))
         
-    if lostHP and curID != tagID:
-        AddTurnFightXP(tagObj, __GetAddXP_Defender(tagObj, lostHP), "skillID:%s" % skillID)
+    if lostHP > 0 and curID != tagID:
+        addXP = IpyGameDataPY.GetFuncCfg("AngerXP", 4)
+        AddTurnFightXP(tagObj, addXP, "skillID:%s" % skillID)
     return
-
-def __GetAddXP_Attack(attack, curSkill):
-    ## 攻击方增加的XP值根据主动普攻技能获得
-    if not curSkill:
-        return 0
-    if not SkillCommon.isTurnNormalAtkSkill(curSkill):
-        return 0
-    return IpyGameDataPY.GetFuncCfg("AngerXP", 3)
-
-def __GetAddXP_Defender(defender, lostHP):
-    ## 掉血方增加的XP值根据掉血百分比获得
-    if lostHP <= 0:
-        return 0
-    return IpyGameDataPY.GetFuncCfg("AngerXP", 4)
 
 def AddTurnFightXP(gameObj, addXP, reason=""):
     ## 回合战斗增加XP
@@ -1435,10 +1425,9 @@
         
         for useInfo in useSkillList:
             useSkill = useInfo[-1]
-            skillID = useSkill.GetSkillID()
+            #skillID = useSkill.GetSkillID()
             atkOK, tagObj = DoNPCUseSkill(curNPC, useSkill, tick)
             if atkOK:
-                AddTurnFightXP(curNPC, __GetAddXP_Attack(curNPC, useSkill), "skillID:%s" % skillID)
                 break
             
     curNPC.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 无论攻击成功与否都重置战斗类型
@@ -1674,23 +1663,82 @@
             return tagNPC
     return
 
-def SetKilled(gameObj, killer=None):
+def SetTurnObjKilled(gameObj, killer=None):
     if not gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightPosInfo):
         #GameWorld.DebugLog("非回合战斗主体被击杀: curID=%s" % gameObj.GetID())
         return
     
-    GameWorld.DebugLog("        %s 回合战斗主体被击杀: curID=%s" % (GetObjName(gameObj), gameObj.GetID()))
-    GameObj.SetHP(gameObj, 0) # 回合制死亡仅设置为0,实例暂时不回收
+    objID = gameObj.GetID()
+    GameWorld.DebugLog("        %s 回合战斗主体被击杀: curID=%s" % (GetObjName(gameObj), objID))
+    gameObj.SetCurAction(IPY_GameWorld.laNPCDie)
+    if GameObj.GetHP(gameObj) != 0:
+        GameObj.SetHP(gameObj, 0) # 回合制死亡仅设置为0,实例暂时不回收
     gameObj.SetVisible(False)
     
-    turnFight = GetTurnFightMgr().getNPCTurnFight(gameObj.GetID())
-    if turnFight:
-        clientPack = ChPyNetSendPack.tagMCTurnFightObjDead()
-        clientPack.ObjID = gameObj.GetID()
-        turnFight.addBatPack(clientPack)
+    turnFight = GetTurnFightMgr().getNPCTurnFight(objID)
+    if not turnFight:
+        return True
+    clientPack = ChPyNetSendPack.tagMCTurnFightObjDead()
+    clientPack.ObjID = objID
+    turnFight.addBatPack(clientPack)
+    
+    # 记录主动发起的玩家阵营击杀
+    curPlayer = turnFight.curPlayer
+    if killer and curPlayer and killer.GetDictByKey(ChConfig.Def_Obj_Dict_LineupPlayerID) == curPlayer.GetPlayerID():
+        if objID not in turnFight.playerKillObjIDList:
+            turnFight.playerKillObjIDList.append(objID)
+        GameWorld.DebugLog("玩家单次击杀统计: %s" % turnFight.playerKillObjIDList)
         
     return True
 
+def OnTurnfightAttackSuccess(curObj, tagObj, curSkill):
+    ## 回合战斗攻击成功额外处理,AttackResult之前,一般处理技能相关
+    if curObj.GetGameObjType() != IPY_GameWorld.gotNPC:
+        return
+    if not curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightPosInfo):
+        return
+    
+    objID = curObj.GetID()
+    turnFight = GetTurnFightMgr().getNPCTurnFight(objID)
+    if not turnFight:
+        return
+    
+    skillID = curSkill.GetSkillID() if curSkill else 0
+    isXP = SkillCommon.isXPSkill(curSkill)
+    if isXP:
+        GameObj.SetXP(curObj, 0)
+    elif curSkill:
+        if SkillCommon.isTurnNormalAtkSkill(curSkill):
+            addXP = IpyGameDataPY.GetFuncCfg("AngerXP", 3)
+            AddTurnFightXP(curObj, addXP, "skillID:%s" % skillID)
+            
+    curPlayer = turnFight.curPlayer
+    # 仅主动发起玩家阵容触发
+    if curPlayer and curObj.GetDictByKey(ChConfig.Def_Obj_Dict_LineupPlayerID) == curPlayer.GetPlayerID():
+        FBLogic.OnPlayerLineupAttackSuccess(curPlayer, curObj, tagObj, curSkill, turnFight.mapID, turnFight.funcLineID)
+        
+    return
+
+def OnTurnfightAttackResult(curObj, tagObj, curSkill):
+    ## 回合战斗攻击结果额外处理,AttackResult 之后,一般处理击杀结算相关
+    if curObj.GetGameObjType() != IPY_GameWorld.gotNPC:
+        return
+    if not curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightPosInfo):
+        return
+    
+    objID = curObj.GetID()
+    turnFight = GetTurnFightMgr().getNPCTurnFight(objID)
+    if not turnFight:
+        return
+    
+    curPlayer = turnFight.curPlayer
+    # 仅主动发起玩家阵容触发
+    if curPlayer and curObj.GetDictByKey(ChConfig.Def_Obj_Dict_LineupPlayerID) == curPlayer.GetPlayerID():
+        FBLogic.OnPlayerLineupAttackResult(curPlayer, curObj, tagObj, curSkill, turnFight.mapID, turnFight.funcLineID)
+        
+    turnFight.playerKillObjIDList = []
+    return
+
 def OnTurnAllOver(guid):
     ## 所有回合已经全部执行完毕
     GameWorld.DebugLog("所有回合结束")

--
Gitblit v1.8.0