From a42f5ee6615a14ff1f2291952ca14fd4e293f72e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 28 四月 2025 14:58:14 +0800
Subject: [PATCH] 10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(FamilyGCZ命令支持技能攻击)
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py | 82 ++++++++++++++++++++++++++++++++++++-----
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FamilyGCZ.py | 3 +
2 files changed, 74 insertions(+), 11 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):
## 攻击
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FamilyGCZ.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FamilyGCZ.py
index fd4d6a0..6b897ff 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FamilyGCZ.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FamilyGCZ.py
@@ -38,6 +38,7 @@
GameWorld.DebugAnswer(curPlayer, "设大本营: FamilyGCZ c 等级 [经验]")
GameWorld.DebugAnswer(curPlayer, "攻击城池: FamilyGCZ a 城池ID [攻击次数 仙盟ID]")
GameWorld.DebugAnswer(curPlayer, "攻击城池: FamilyGCZ h 城池ID 剩余血量 [攻击方人数 仙盟ID]")
+ GameWorld.DebugAnswer(curPlayer, "技能攻击: FamilyGCZ s 技能类型 [城池ID 攻方ID]")
GameWorld.DebugAnswer(curPlayer, "击毁城池: FamilyGCZ k [城池ID 攻击方仙盟ID]")
GameWorld.DebugAnswer(curPlayer, "输出城池: FamilyGCZ p [战场类型 分组编号]")
GameWorld.DebugAnswer(curPlayer, "山寨竞猜: FamilyGCZ g 人数 [竞猜ID1 ID2 ID3]")
@@ -67,7 +68,7 @@
GameWorld.DebugAnswer(curPlayer, "设置体力: %s" % updEnergy)
return
- if value in ["x", "c", "a", "h", "k", "p", "g"]:
+ if value in ["x", "c", "a", "h", "k", "p", "g", "s"]:
dataMsg = {"ActMsgType":"GMCMD", "playerID":playerID, "msgList":msgList}
GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_FamilyGCZ, dataMsg)
return
--
Gitblit v1.8.0