From 6b76741f4ea905c4de5997c40b0476bd63fa37b8 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 12 一月 2024 16:27:29 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(增加伤血统计、奖励结算及通知;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py |   61 ++++++++++++++++++++++++++----
 1 files changed, 53 insertions(+), 8 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 ad2a386..1cdcb8c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -32,6 +32,8 @@
 import PetControl
 import SkillShell
 import BuffSkill
+import FBCommon
+import ItemControler
 
 (
 FightState_Start,
@@ -52,7 +54,8 @@
         objName = "%s[%s]" % (objName, mirrorPlayerID)
     faction = GameObj.GetFaction(gameObj)
     fightPlaceNum = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum)
-    return "%s%s %s" % ("A" if faction == 1 else "B", fightPlaceNum, objName)
+    curID = gameObj.GetNPCID() if gameObj.GetGameObjType() == IPY_GameWorld.gotNPC else ""
+    return "%s%s %s%s" % ("A" if faction == 1 else "B", fightPlaceNum, objName, curID)
 
 #// B4 10 回合制战斗 #tagCMTurnFight
 #
@@ -94,7 +97,8 @@
 def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick):
     playerID = curPlayer.GetPlayerID()
     posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY()
-    GameWorld.DebugLog("===== 执行回合制战斗: mapID=%s,funcLineID=%s,tagPlayerID=%s" % (mapID, funcLineID, tagPlayerID), playerID)
+    GameWorld.DebugLog("===== 执行回合制战斗: mapID=%s,funcLineID=%s,playerID=%s,tagPlayerID=%s" % (mapID, funcLineID, playerID, tagPlayerID))
+    ipyData = None
     tagObj = None
     if tagPlayerID:
         npcID = ChConfig.Def_NPCID_PVP
@@ -205,16 +209,42 @@
             break
                 
     GameWorld.DebugLog("--- 战斗结束处理 ---")
-    overState = FightState_Win if isWin else FightState_Fail
-    SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, overState, turnNum, turnMax)
+    # 统计总伤害
+    factionTotalHurtDict = {}
+    for gameObj in fightObjList:
+        if not gameObj:
+            continue
+        faction = GameObj.GetFaction(gameObj)
+        objName = GetObjName(gameObj)
+        objID = gameObj.GetID()
+        totalHurtEx = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurtEx) * ChConfig.Def_PerPointValue
+        totalHurt = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurt) + totalHurtEx
+        factionTotalHurtDict[faction] = factionTotalHurtDict.get(faction, 0) + totalHurt
+        GameWorld.DebugLog("%s objID=%s,faction=%s, 总输出: %s" % (objName, objID, faction, totalHurt))
+    for faction, totalHurt in factionTotalHurtDict.items():
+        GameWorld.DebugLog("faction=%s, 阵营总输出: %s" % (faction, totalHurt))
+        
+    GameWorld.DebugLog("玩家剩余血量: %s / %s" % (GameObj.GetHP(curPlayer), GameObj.GetMaxHP(curPlayer)))
+    GameWorld.DebugLog("对方剩余血量: %s / %s" % (GameObj.GetHP(tagObj), GameObj.GetMaxHP(tagObj)))
     
     # 结算奖励...待扩展
+    awardItemList = []
+    if isWin and ipyData:
+        # 山寨测试先默认都是首次奖励,正式后需删除
+        awardItemList = ipyData.GetAwardItemListFirst()
+        
+    GameWorld.DebugLog("奖励物品: %s" % awardItemList)
+    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}])
+    
+    overMsg = {"itemInfo":FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)}
+    overState = FightState_Win if isWin else FightState_Fail
+    SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, overState, turnNum, turnMax, str(overMsg))
     
     for gameObj in fightObjList:
         TurnFightObjOverReset(gameObj, tick)
         
-    GameWorld.DebugLog("===== 回合制战斗结束: mapID=%s,funcLineID=%s,tagPlayerID=%s,isWin=%s,overState=%s" 
-                       % (mapID, funcLineID, tagPlayerID, isWin, overState), playerID)
+    GameWorld.DebugLog("===== 回合制战斗结束: mapID=%s,funcLineID=%s,playerID=%s,tagPlayerID=%s,isWin=%s,overState=%s" 
+                       % (mapID, funcLineID, playerID, tagPlayerID, isWin, overState))
     return
 
 def CheckIswin(curPlayer, tagObj):
@@ -364,6 +394,8 @@
     isMainRole = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightMainRole)
     gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightID, playerID)
     gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnRebornCount, 0)
+    gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurt, 0)
+    gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, 0)
     SetTimeline(gameObj, 1, 0)
     GameObj.SetFaction(gameObj, faction)
     GameObj.SetHPFull(gameObj)
@@ -524,7 +556,7 @@
             if curBuff.GetCalcStartTick() > timeLine:
                 # 回合制中产生的buff是以timeline作为CalcStartTick的,所以超过timeline的可视为非回合制buff
                 continue
-            GameWorld.DebugLog("    删除回合制buff: buffSkillID=%s" % buffSkillID, objID)
+            GameWorld.DebugLog("    删除回合制buff: objID=%s,buffSkillID=%s" % (objID, buffSkillID))
             ownerID, ownerType = curBuff.GetOwnerID(), curBuff.GetOwnerType()
             BuffSkill.DoBuffDisApper(gameObj, curBuff, tick)
             buffState.DeleteBuffByIndex(i)
@@ -551,6 +583,17 @@
     NPCCommon.SetDeadEx(gameObj)
     return
 
+def AddTurnObjHurtValue(curObj, tagObj, hurtType, hurtValue, curSkill=None):
+    if not curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
+        return
+    skillID = curSkill.GetSkillID() if curSkill else 0
+    totalHurtEx = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurtEx) * ChConfig.Def_PerPointValue
+    totalHurt = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurt) + totalHurtEx + hurtValue
+    curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurt, totalHurt % ChConfig.Def_PerPointValue)
+    curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, totalHurt / ChConfig.Def_PerPointValue)
+    GameWorld.DebugLog("        伤血: curTD=%s,tagID=%s,skillID=%s,hurtType=%s,hurtValue=%s,totalHurt=%s" 
+                       % (curObj.GetID(), tagObj.GetID(), skillID, hurtType, hurtValue, totalHurt))
+    return
 
 def DoAttack(curObj, tagObj, tick):
     curID = curObj.GetID()
@@ -780,7 +823,7 @@
             GameWorld.DebugLog("        %s 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK))
     return useSkillResult
 
-def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0):
+def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0, msg=""):
     clientPack = ChPyNetSendPack.tagMCTurnFightState()
     clientPack.Clear()
     clientPack.MapID = mapID
@@ -789,6 +832,8 @@
     clientPack.State = state
     clientPack.TurnNum = turnNum
     clientPack.TurnMax = turnMax
+    clientPack.Msg = msg
+    clientPack.Len = len(clientPack.Msg)    
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 

--
Gitblit v1.8.0