From f57e8ca8c2c367578d5e7a358aa44f7b7cadf3bb Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 28 四月 2025 15:00:07 +0800
Subject: [PATCH] 10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(FamilyGCZ命令支持技能攻击)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py |   82 ++++++++++++++++++++++++++++++++++++-----
 1 files changed, 72 insertions(+), 10 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py
index a48413b..9f8fc27 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py
@@ -1584,14 +1584,14 @@
     gczMgr = GetFamilyGCZMgr()
     joinMember = gczMgr.GetJoinMember(playerID)
     if not joinMember:
-        GameWorld.ErrLog("非仙盟攻城战参赛成员!", playerID)
+        GameWorld.DebugAnswerCross(playerID, serverGroupID, "非仙盟攻城战参赛成员:%s" % playerID)
         return
     zoneID = joinMember.zoneID
     familyID = joinMember.familyID
     zone = gczMgr.GetActZone(zoneID)
     joinFamily = zone.GetZoneJoinFamily(familyID)
     if not joinFamily:
-        GameWorld.ErrLog("非仙盟攻城战参赛仙盟! familyID=%s" % familyID, playerID)
+        GameWorld.DebugAnswerCross(playerID, serverGroupID, "非仙盟攻城战参赛仙盟:%s" % familyID)
         return
     batType, groupNum = joinMember.batType, joinMember.groupNum
     batGroup = zone.GetBatGroup(batType, groupNum)
@@ -1608,7 +1608,7 @@
     curRound, roundState = GetRoundState(state)
     
     value0 = msgList[0]
-    if value0 in ["a", "h", "k"]:
+    if value0 in ["a", "h", "k", "s"]:
         if not curRound or (curRound and roundState != FamilyGCZRoundState_Fight):
             GameWorld.DebugAnswerCross(playerID, serverGroupID, "非战斗阶段!state=%s" % (state))
             return
@@ -1634,7 +1634,7 @@
             GameWorld.DebugAnswerCross(playerID, serverGroupID, "目标城池不存在:%s" % (tagCityID))
             return
         atkOK = __DoGMAtkCity(playerID, serverGroupID, zoneID, curRound, batType, groupNum, curCityID, tagCityID, atkCntTotal, 0, atkMemberID)
-        GameWorld.DebugAnswerCross(playerID, serverGroupID, "atkOK:%s,remainHP:%s" % (atkOK, tagCity.hp))
+        GameWorld.DebugAnswerCross(playerID, serverGroupID, "atkOK:%s,remainHP:%s" % (atkOK != None, tagCity.hp))
         
     #攻击城池: FamilyGCZ a 城池ID 剩余血量 [攻击方人数 仙盟ID]
     elif value0 == "h":
@@ -1662,8 +1662,68 @@
             return
         hurtValueTotal = tagCity.hp - remainHP
         atkOK = __DoGMAtkCity(playerID, serverGroupID, zoneID, curRound, batType, groupNum, curCityID, tagCityID, 0, hurtValueTotal, atkMemberID)
-        GameWorld.DebugAnswerCross(playerID, serverGroupID, "atkOK:%s,remainHP:%s" % (atkOK, tagCity.hp))
-    
+        GameWorld.DebugAnswerCross(playerID, serverGroupID, "atkOK:%s,remainHP:%s" % (atkOK != None, tagCity.hp))
+        
+    #技能攻击: FamilyGCZ s 技能类型 [城池ID 攻击方ID]   
+    elif value0 == "s":
+        atkType = msgList[1] if len(msgList) > 1 else 0
+        tagCityID = msgList[2] if len(msgList) > 2 else 0
+        atkMemberID = msgList[3] if len(msgList) > 3 else playerID
+        hurtMulti = msgList[4] if len(msgList) > 4 else 2
+        hurtFamilyCnt = msgList[5] if len(msgList) > 5 else 10
+        atkJoinMember = zone.GetZoneJoinMember(atkMemberID)
+        if not atkJoinMember:
+            GameWorld.DebugAnswerCross(playerID, serverGroupID, "攻击方不存在:%s" % atkMemberID)
+            return
+        atkFamilyID = atkJoinMember.familyID
+        atkJoinFamily = zone.GetZoneJoinFamily(atkFamilyID)
+        curCityID = atkJoinFamily.cityWall.cityID
+        
+        batFightPower = atkJoinMember.fightPower
+        hurtValueTotal = batFightPower * hurtMulti # 总伤害
+        
+        canAtkedCityList = []
+        # 技能单体
+        if atkType == AtkType_SkillSingle:
+            tagCity = batGroup.GetCityWall(tagCityID)
+            if not tagCity:
+                GameWorld.DebugAnswerCross(playerID, serverGroupID, "目标城池不存在:%s" % (tagCityID))
+                return
+            if atkFamilyID == tagCity.familyID:
+                GameWorld.DebugAnswerCross(playerID, serverGroupID, "不能攻击自己仙盟")
+                return
+            canAtkedCityList.append(tagCity)
+            
+        # 技能群体
+        elif atkType == AtkType_SkillArea:
+            for tagCityID in batGroup.cityWallDict.keys(): # 遍历同组城池
+                if tagCityID == curCityID:
+                    #不打自己
+                    continue
+                tagCity = batGroup.GetCityWall(tagCityID)
+                if not tagCity or tagCity.IsBroken():
+                    # 已被摧毁的
+                    continue
+                canAtkedCityList.append(tagCity)
+            if len(canAtkedCityList) > hurtFamilyCnt:
+                random.shuffle(canAtkedCityList)
+                canAtkedCityList = canAtkedCityList[:hurtFamilyCnt]
+                
+        else:
+            GameWorld.DebugAnswerCross(playerID, serverGroupID, "非技能攻击类型(%s)" % atkType)
+            return
+        
+        oneHurtTotal = hurtValueTotal / len(canAtkedCityList) # 所有可攻击的目标仙盟平摊伤害
+        hurtDict = {}
+        killCntTotal = 0
+        for tagCity in canAtkedCityList:
+            tagCityID = tagCity.cityID
+            atkOK = __DoGMAtkCity(playerID, serverGroupID, zoneID, curRound, batType, groupNum, curCityID, tagCityID, 0, oneHurtTotal, atkMemberID, atkType)
+            if atkOK != None:
+                hurtDict[tagCityID] = oneHurtTotal
+                killCntTotal += atkOK
+        Sync_FamilyGCZBatSceneInfo(zoneID, batType, groupNum, atkMemberID, atkType, hurtDict, killCntTotal)
+        
     #击毁城池: FamilyGCZ k [城池ID 攻击方仙盟ID]    
     elif value0 == "k":
         tagCityID = msgList[1] if len(msgList) > 1 else 0
@@ -1693,7 +1753,7 @@
         tagCityID = tagCity.cityID
         hurtValueTotal = tagCity.hp
         atkOK = __DoGMAtkCity(playerID, serverGroupID, zoneID, curRound, batType, groupNum, curCityID, tagCityID, 0, hurtValueTotal)
-        GameWorld.DebugAnswerCross(playerID, serverGroupID, "killOK:%s,目标:%s,攻击方:%s" % (atkOK, tagCityID, curCityID))
+        GameWorld.DebugAnswerCross(playerID, serverGroupID, "killOK:%s,目标:%s,攻击方:%s" % (atkOK != None, tagCityID, curCityID))
         
     #输出城池: FamilyGCZ p [战场类型 分组编号]
     elif value0 == "p":
@@ -1754,7 +1814,7 @@
         GameWorld.DebugAnswerCross(playerID, serverGroupID, "    HP: %s/%s %s" % (city.hp, city.hpMax, broken))
     return
 
-def __DoGMAtkCity(gmPlayerID, serverGroupID, zoneID, curRound, batType, groupNum, curCityID, tagCityID, atkCntTotal=0, hurtValueTotal=0, atkMemberID=0):
+def __DoGMAtkCity(gmPlayerID, serverGroupID, zoneID, curRound, batType, groupNum, curCityID, tagCityID, atkCntTotal=0, hurtValueTotal=0, atkMemberID=0, atkType=AtkType_Normal):
     '''GM攻击城池
     @param curCityID: 攻击方城池ID
     @param tagCityID: 防守方城池ID
@@ -1890,11 +1950,13 @@
         GameWorld.DebugLog("    攻击方仙盟城池已被摧毁,不再累加本轮仙盟伤害榜值! familyID=%s" % curFamilyID)
         
     if not CheckXiuluoCity(zoneID, curRound, batType, groupNum, gmPlayerID):
-        Sync_FamilyGCZBatSceneInfo(zoneID, batType, groupNum)
+        if atkType == AtkType_Normal: # 技能攻击外层统一通知
+            Sync_FamilyGCZBatSceneInfo(zoneID, batType, groupNum)
     Sync_FamilyGCZBatCityInfo(zoneID, batType, groupNum, tagCityID)
     if tagFamilyID:
         Sync_FamilyGCZCampInfo(zoneID, tagFamilyID, defMemIDList=atkedGuardIDList)
-    return True
+        
+    return killCnt
 
 def __clientServer_Atk(serverGroupID, msgData):
     ## 攻击

--
Gitblit v1.8.0