10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(FamilyGCZ命令支持技能攻击)
2个文件已修改
85 ■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossFamilyGCZ.py 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FamilyGCZ.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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):
    ## 攻击
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