| | |
| | | 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)
|
| | |
| | | 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
|
| | |
| | | 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":
|
| | |
| | | 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
|
| | |
| | | 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":
|
| | |
| | | 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
|
| | |
| | | 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):
|
| | | ## 攻击
|