ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -27,6 +27,8 @@
import NetPackCommon
import PlayerControl
import GameWorld
import PlayerLLMJ
import PlayerPrestigeSys
import IpyGameDataPY
import PlayerOnline
import NPCCommon
@@ -75,6 +77,10 @@
        self.beautyObjIDDict = {} # 红颜战斗单位 {位置编号:batObjID, ...}
        self.actionNum = ActionNumStart # 行动位置,从1开始
        self.totalHurt = 0 # 阵容总输出
        #特殊
        self.bossID = 0
        self.bossPosView = 0
        return
    
    def getPlayerID(self): return self.turnFight.playerID # 发起的玩家ID
@@ -88,6 +94,8 @@
        self.ownerID = lineupInfo.get("PlayerID", 0) # 阵容所属的玩家ID
        self.shapeType = lineupInfo.get("ShapeType", 0)
        self.fightPower = lineupInfo.get("FightPower", 0)
        self.bossID = lineupInfo.get("BossID", 0)
        self.bossPosView = lineupInfo.get("BossPosView", 0)
        SummonLineupObjs(self, self.faction, self.num, lineupInfo, self.getPlayerID())
        return
    
@@ -176,6 +184,7 @@
        self.isNeedReport = isNeedReport # 是否需要战报
        self.msgDict = {} # 扩展信息字典,一般由MapID绑定的功能决定信息内容  {k:v, ...}
        self._kvDict = {} # 自定义信息字典,不会被重置  {k:v, ...}
        self.awardData = None # 战斗奖励设置的数据,可以是任意数据格式,由功能自行决定,会传递给 OnTurnFightAward 处理
        
        self.factionDict = {} # 战斗阵营 {faction:BatFaction, ...},一般是只有两个阵营,faction为1或2,每个阵营支持多个阵容
        self.actionSortList = [] # 阵容行动顺序 [[faction, num], ...]
@@ -205,6 +214,7 @@
        self.setPVP()
        self.msgDict = {}
        self._kvDict = {}
        self.awardData = None
        self.nextTurnFight(msgDict)
        return
    
@@ -384,7 +394,10 @@
                    tfObj.MaxHP = batObj.GetMaxHP() % ChConfig.Def_PerPointValue
                    tfObj.MaxHPEx = batObj.GetMaxHP() / ChConfig.Def_PerPointValue
                    tfObj.LV = batObj.GetLV()
                    tfObj.PosNum = posNum
                    if batLineup.bossPosView and batLineup.bossID == batObj.GetNPCID():
                        tfObj.PosNum = batLineup.bossPosView
                    else:
                        tfObj.PosNum = posNum
                    tfObj.AngreXP = batObj.GetXP()
                    tfLineup.ObjList.append(tfObj)
                tfLineup.ObjCnt = len(tfLineup.ObjList)
@@ -503,6 +516,18 @@
        self.waveMax = 6 # 本关最大波数,每波有多个小队,每个小队即为一张战斗 TurnFight
        self.wave = 0 # 当前刷怪波,注意不是玩家当前进度波,比如被击杀会回退一波
        self.turnFight = GetTurnFightMgr().addTurnFight(ChConfig.Def_FBMapID_Main, 0, playerID)
        # 主线小怪战斗额外数据,一般用于分割与主线战斗表现无关的附加功能内容
        self.useZhanchui = 0
        self.mjExp = 0 # 历练秘笈额外经验
        self.killNPCCnt = 0
        return
    def resetMainFightExDataRec(self):
        ## 重置主线战斗相关的额外数据记录,每次前端请求主线小怪战斗处理后需要重置
        self.useZhanchui = 0
        self.mjExp = 0
        self.killNPCCnt = 0
        return
    
    def isLevelBoss(self):
@@ -600,9 +625,11 @@
    ipyData = IpyGameDataPY.GetIpyGameData("NPCLineup", lineupID)
    if not ipyData:
        return {}
    bossID = ipyData.GetBossID()
    bossPosView = ipyData.GetBossPosView()
    
    heroDict = {}
    for posNum in range(1, 1 + 10):
    for posNum in range(1, 1 + 6):
        if not hasattr(ipyData, "GetPosNPCID%s" % posNum):
            break
        npcID = getattr(ipyData, "GetPosNPCID%s" % posNum)()
@@ -613,7 +640,7 @@
            continue
        heroDict[str(posNum)] = battleDict
        
    lineupInfo = {"NPCLineupID":lineupID, "Hero":heroDict}
    lineupInfo = {"NPCLineupID":lineupID, "Hero":heroDict, "BossID":bossID, "BossPosView":bossPosView}
    return lineupInfo
def GetNPCBattleDict(lineupIpyData, npcID, strongerLV=0, difficulty=0):
@@ -819,6 +846,8 @@
            
        batLineup.posObjIDDict[posNum] = objID
        GameWorld.DebugLog("AddBatObj %s,skill=%s" % (GetObjName(batObj), skillManager.GetSkillIDList()))
        ResetObjSkill(batObj)
        if npcID:
            #副本指定NPC属性
            fbNPCInitAttrDict = FBLogic.GetFBNPCInitAttr(curPlayer, turnFight, batObj)
@@ -853,8 +882,7 @@
        buffMgr.ClearBuff()
        
        # 重置技能
        batObj.ResetSkillUseCnt()
        ResetObjSkillCD(batObj)
        ResetObjSkill(batObj)
        
        # 重刷属性、被动
        TurnBuff.RefreshBuffAttr(batObj)
@@ -999,7 +1027,9 @@
            break
        
    PlayerOnline.GetOnlinePlayer(curPlayer).SetLastBatBuffer(guid, turnFight.batBuffer)
    SyncTurnFightReport(curPlayer, guid, turnFight.batBuffer)
    SyncTurnFightReport(curPlayer, guid, turnFight.batBuffer) # 同步战报
    #在同步战报后再处理结算奖励,与战斗表现分离
    FBLogic.OnTurnFightAward(curPlayer, turnFight, mapID, funcLineID, turnFight.awardData)
    tfMgr.delTurnFight(guid)
    return True
@@ -1038,6 +1068,7 @@
    
    PlayerOnline.GetOnlinePlayer(curPlayer).SetLastBatBuffer(guid, turnFight.batBuffer)
    SyncTurnFightReport(curPlayer, guid, turnFight.batBuffer)
    FBLogic.OnTurnFightAward(curPlayer, turnFight, mapID, funcLineID, turnFight.awardData)
    tfMgr.delTurnFight(guid)
    return True
@@ -1068,6 +1099,9 @@
        return
    
    GameWorld.DebugLog("------------------- 主线战斗请求: reqType=%s" % reqType, curPlayer.GetPlayerID())
    mainFightMgr = GetMainFightMgr(curPlayer)
    mainFightMgr.resetMainFightExDataRec() # 请求时补重置,防止异常时重复结算逻辑
    clientPack = ChPyNetSendPack.tagSCTurnFightReportSign()
    clientPack.Sign = 0
    NetPackCommon.SendFakePack(curPlayer, clientPack) # 标记开始
@@ -1082,6 +1116,34 @@
    # 标记结束
    clientPack.Sign = 1
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    __doMainFightExDataFunc(curPlayer)
    return
def __doMainFightExDataFunc(curPlayer):
    mainFightMgr = GetMainFightMgr(curPlayer)
    # 本次消耗战锤数
    useZhanchui = mainFightMgr.useZhanchui
    if useZhanchui > 0:
        PlayerLLMJ.AddUseZhanchui(curPlayer, useZhanchui)
        PlayerPrestigeSys.AddRealmTaskValue(curPlayer, PlayerPrestigeSys.RealmTaskType_UseXiantao, useZhanchui)
        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_CutTree, useZhanchui)
        PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_CutTree, useZhanchui)
    # 历练秘境额外经验
    mjExp = mainFightMgr.mjExp
    if mjExp > 0:
        PlayerLLMJ.AddExpEx(curPlayer, mjExp)
    # 击杀怪物
    killNPCCnt = mainFightMgr.killNPCCnt
    if killNPCCnt > 0:
        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_KillNPC, killNPCCnt)
        PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_KillNPC, killNPCCnt)
    # 结算逻辑最后重置数据
    mainFightMgr.resetMainFightExDataRec()
    return
def __doExitMainFight(curPlayer):
@@ -1413,8 +1475,9 @@
            
            turnFight.ResetOneActionUseSkillCnt()
            batObj.SetTiming(ChConfig.TurnTiming_Before) # 重置时机到回合前
            RefreshObjSkillByTurn(batObj) # 优先刷技能CD
            if turnNum > 1: # 第1回合不用刷新技能
                RefreshObjSkillByTurn(batObj)
            TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BigTurnStart)
            
    return
@@ -1469,21 +1532,28 @@
    RefreshObjBuffTime(turnFight, batObj)
    return
def ResetObjSkillCD(batObj):
    ## 重置所有技能CD
def ResetObjSkill(batObj):
    ## 重置所有技能,一般是每场战斗开始的重置
    curID = batObj.GetID()
    batObj.ResetSkillUseCnt() # 使用次数
    skillManager = batObj.GetSkillManager()
    for index in range(0, skillManager.GetSkillCount()):
        curSkill = skillManager.GetSkillByIndex(index)
        if not curSkill:
            continue
        remainTime = curSkill.GetRemainTime()
        if remainTime <= 0:
            continue
        curSkill.SetRemainTime(0)
        skillID = curSkill.GetSkillID()
        initCD = curSkill.GetCoolDownInit()
        if initCD:
            curSkill.SetRemainTime(initCD)
            GameWorld.DebugLog("技能初始CD: curID=%s,skillID=%s,initCD=%s" % (curID, skillID, initCD))
        elif curSkill.GetRemainTime():
            curSkill.SetRemainTime(0)
        curSkill.SetEnergy(0)
    return
def RefreshObjSkillByTurn(batObj):
    '''按回合刷新技能:默认以大回合统一减1回合,使用技能后设置剩余CD统一默认加1回合,即配置1回合,设置的CD是2
    '''按回合刷新技能:默认以大回合统一减1回合
    '''
    curID = batObj.GetID()
    skillManager = batObj.GetSkillManager()
@@ -1493,7 +1563,6 @@
            continue
        skillID = curSkill.GetSkillID()
        preTurnUseCnt = batObj.GetSkillTurnUseCnt(skillID)
        batObj.ResetSkillTurnUseCnt() # 重置回合使用次数
        remainTime = curSkill.GetRemainTime()
        if remainTime <= 0:
            continue
@@ -1504,6 +1573,7 @@
        curSkill.SetRemainTime(remainTime)
        GameWorld.DebugLog("    更新技能CD: curID=%s,skillID=%s,remainTime=%s" % (curID, skillID, remainTime))
        
    batObj.ResetSkillTurnUseCnt() # 重置回合使用次数,放刷新CD后重置
    return
def RefreshObjBuffTime(turnFight, batObj):
@@ -1677,8 +1747,7 @@
    
    # 暂时只算主线小怪
    if curPlayer and turnFight.mapID == ChConfig.Def_FBMapID_Main and gameObj.GetFaction() != ChConfig.Def_FactionA:
        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_KillNPC, 1)
        PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_KillNPC, 1)
        GetMainFightMgr(curPlayer).killNPCCnt += 1
    return True
def OnTurnAllOver(guid):