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