ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -29,6 +29,8 @@
import GameWorld
import PlayerLLMJ
import PlayerPrestigeSys
import CrossServerPackLogic
import PlayerSuccess
import IpyGameDataPY
import PlayerOnline
import NPCCommon
@@ -47,7 +49,6 @@
import random
import time
import json
import shutil
import os
g_gmTestFightReq = []
@@ -176,7 +177,7 @@
    def __init__(self, guid, mapID=0, funcLineID=0, reqPlayerID=0, reqServerID=0):
        self.guid = guid # 某场战斗的唯一guid,可用于存储记录如战报等
        self._reqPlayerID = reqPlayerID # 可能为0,系统后台自动处理的战斗时为0,某个玩家发起则为发起玩家ID,同个玩家ID可能同时存在多场战斗,如主线+其他
        self._reqServerID = reqServerID
        self._reqServerID = reqServerID # 可能是玩家的服务器ID,或者请求的ServerID
        self.curPlayer = None
        self.mapID = mapID
        self.funcLineID = funcLineID
@@ -457,7 +458,8 @@
        if self._isNeedReport:
            packBuff = clientPack.GetBuffer()
            buffLen = len(packBuff)
            GameWorld.DebugLog("回合战斗过程封包: %s, len:%s, %s" % (headStr, buffLen, CommFunc.B2Hex(packBuff)))
            #GameWorld.DebugLog("回合战斗过程封包: %s, len:%s, %s" % (headStr, buffLen, CommFunc.B2Hex(packBuff)))
            GameWorld.DebugLog("回合战斗过程封包: %s, len:%s" % (headStr, buffLen))
            self.batBuffer += CommFunc.WriteWORD("", buffLen)
            self.batBuffer += packBuff
            ObjPool.GetPoolMgr().release(clientPack)
@@ -601,13 +603,15 @@
        hero = lineup.GetLineupHero(posNum)
        heroID = hero.heroID
        itemIndex = hero.itemIndex
        userData = ""
        heroLV = 1
        star = 0
        if itemIndex >= 0 and itemIndex < curPack.GetCount():
            heroItem = curPack.GetAt(itemIndex)
            if heroItem and not heroItem.IsEmpty():
                userData = heroItem.GetUserData()
                heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV)
                star = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
                #breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
                #awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV)
                
        skillIDlist = []
        skillIDlist += hero.heroSkillIDList
@@ -615,7 +619,9 @@
                                 "HeroID":heroID,
                                 "SkinID":hero.skinID,
                                 "LV":heroLV,
                                 "Data":userData,
                                 "Star":star,
                                 #"BreakLV":breakLV,
                                 #"AwakeLV":awakeLV,
                                 "FightPower":hero.fightPower,
                                 "AttrDict":{str(k):v for k, v in hero.heroBatAttrDict.items() if v > 0},
                                 "SkillIDList":skillIDlist,
@@ -753,6 +759,7 @@
        return
    heroID = npcData.GetRelatedHeroID()
    npcLV = npcData.GetLV()
    star, breakLV, awakeLV = 0, 0, 0
    
    lvIpyData = None
    heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if heroID else None
@@ -763,11 +770,14 @@
            npcLV = strongerLV
    if not lvIpyData:
        lvIpyData = IpyGameDataPY.GetIpyGameData("PlayerLV", npcLV)
    if lvIpyData:
        star = lvIpyData.GetReHeroStar()
        breakLV = lvIpyData.GetReHeroBreakLV()
        awakeLV = lvIpyData.GetReHeroAwakeLV()
    if heroIpyData and lvIpyData:
        skinIDList = heroIpyData.GetSkinIDList()
        skinID = skinIDList[0] if skinIDList else 0
        skillIDList = GetNPCHeroSkillIDList(heroID, heroIpyData, lvIpyData.GetReHeroBreakLV(), lvIpyData.GetReHeroAwakeLV())
        skillIDList = GetNPCHeroSkillIDList(heroID, heroIpyData, breakLV, awakeLV)
    else:
        heroID = 0
        skinID = 0
@@ -807,6 +817,9 @@
                  "HeroID":heroID,
                  "SkinID":skinID,
                  "LV":npcLV,
                  "Star":star,
                  #"BreakLV":breakLV,
                  #"AwakeLV":awakeLV,
                  "AttrDict":{str(k):v for k, v in batAttrDict.items() if v > 0},
                  "SkillIDList":skillIDList,
                  }
@@ -894,6 +907,7 @@
        heroID = heroInfo.get("HeroID", 0)
        skinID = heroInfo.get("SkinID", 0)
        lv = heroInfo.get("LV", 1)
        star = heroInfo.get("Star", 0)
        specialty, atkDistType, country, sex, job = 0, 1, 0, 1, 0
        heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if heroID else None
        if heroIpyData:
@@ -930,6 +944,7 @@
        batObj.SetLineupPos(posNum, num)
        batObj.SetFightPower(fightPower)
        batObj.SetLV(lv)
        batObj.SetStar(star)
        batObj.SetAtkDistType(atkDistType)
        batObj.SetSpecialty(specialty)
        batObj.SetCountry(country)
@@ -944,7 +959,7 @@
            
        batLineup.posObjIDDict[posNum] = objID
        batLineup.heroObjIDDict[heroID] = objID
        GameWorld.DebugLog("AddBatObj %s,skill=%s" % (GetObjName(batObj), skillManager.GetSkillIDList()))
        GameWorld.DebugLog("AddBatObj %s,lv=%s,star=%s,skill=%s" % (GetObjName(batObj), lv, star, skillManager.GetSkillIDList()))
        ResetObjSkill(batObj)
        
        if npcID:
@@ -1062,6 +1077,7 @@
        return
    
    reqPlayerID = playerID
    playerServerID = GameWorld.GetPlayerServerID(curPlayer)
    guid = GameWorld.GetGUID()
    
    atkLineupInfo = GetPlayerLineupInfo(curPlayer, atkLineupID)
@@ -1087,7 +1103,7 @@
        
        lineupDictA = {1:atkLineupInfo}
        lineupDictB = {1:defLineupInfo}
        AddToBattleQueue(guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID, reqData=[tagType, tagID, valueList])
        AddToBattleQueue(guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID, playerServerID, reqData=[tagType, tagID, valueList])
        
    # NPC
    else:
@@ -1115,11 +1131,11 @@
        
        lineupDictA = {1:atkLineupInfo}
        lineupDictB = None
        AddToBattleQueue(guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID, npcLineupIDList, strongerLV, difficulty)
        AddToBattleQueue(guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID, playerServerID, npcLineupIDList, strongerLV, difficulty)
        
    return True
def AddToBattleQueue(guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID=0, npcLineupIDList=[], strongerLV=0, difficulty=0, reqData=None):
def AddToBattleQueue(guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID=0, playerServerID=0, npcLineupIDList=[], strongerLV=0, difficulty=0, reqData=None):
    '''添加进战斗请求队列,这里做战斗分发处理,由当前服务器根据当前服务器情况分配到本机子的其他战斗地图,或直接本地图处理
    @param lineupDictA: 阵营A所有阵容{阵容编号:{阵容信息}, ...}
    @param lineupDictB: 阵营B所有阵容{阵容编号:{阵容信息}, ...},pvp时用
@@ -1137,21 +1153,31 @@
        # pvp 或 pve 必须要满足其中一种
        return
    
    # 先默认本地图处理,后续优化多战斗地图支持
    reqServerID = GameWorld.GetGameWorld().GetServerID()
    reqInfo = [reqServerID, guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID, npcLineupIDList, strongerLV, difficulty, reqData]
    OnMsg_BattleRequest(reqInfo)
    fromServerID = GameWorld.GetGameWorld().GetServerID()
    reqInfo = [guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID, playerServerID, npcLineupIDList, strongerLV, difficulty, reqData]
    multiMapSet = IpyGameDataPY.GetFuncCfg("TurnFightProcess", 1)
    # 多地图战斗 0-本地图处理;1-多地图处理;2-debug模式默认本地图处理,非debug默认多地图处理
    isMultiMap = False
    if multiMapSet == 1:
        isMultiMap = True
    elif multiMapSet == 2:
        if not GameWorld.GetGameWorld().GetDebugLevel():
            isMultiMap = True
    if isMultiMap:
        CrossServerPackLogic.SendToBattleServer(ShareDefine.SSMsg_BattleRequest, reqInfo, reqPlayerID)
    else:
        SSMsg_BattleRequest(reqInfo, fromServerID)
    return
def OnMsg_BattleRequest(reqInfo):
def SSMsg_BattleRequest(reqInfo, fromServerID):
    ## 请求执行战斗,由本地图或其他服务器地图分配过来的战斗请求
    reqServerID, guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID, npcLineupIDList, strongerLV, difficulty, reqData = reqInfo
    guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID, playerServerID, npcLineupIDList, strongerLV, difficulty, reqData = reqInfo
    
    if npcLineupIDList:
        turnFight = DoTurnFightPVE(guid, mapID, funcLineID, reqPlayerID, reqServerID, lineupDictA, npcLineupIDList, strongerLV, difficulty)
        turnFight = DoTurnFightPVE(guid, mapID, funcLineID, reqPlayerID, playerServerID, lineupDictA, npcLineupIDList, strongerLV, difficulty)
    else:
        turnFight = DoTurnFightPVP(guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID, reqServerID)
        turnFight = DoTurnFightPVP(guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID, playerServerID)
        
    winFaction = None
    statMsg = {}
@@ -1164,16 +1190,15 @@
    retInfo = [guid, mapID, funcLineID, reqPlayerID, winFaction, statMsg, dateStr, reqData]
    
    # 本地图自己处理的
    if reqServerID == GameWorld.GetGameWorld().GetServerID():
        OnMsg_BattleResult(retInfo)
    if fromServerID == GameWorld.GetGameWorld().GetServerID():
        SSMsg_BattleResult(retInfo, fromServerID)
        
    # 其他服务器地图请求的,发送战斗结果回去
    else:
        pass
        CrossServerPackLogic.SendToServer(ShareDefine.SSMsg_BattleResult, retInfo, [fromServerID], playerID=reqPlayerID)
    return
def OnMsg_BattleResult(retInfo):
def SSMsg_BattleResult(retInfo, fromServerID):
    ## 收到战斗结果信息
    
    guid, mapID, funcLineID, reqPlayerID, winFaction, statMsg, dateStr, reqData = retInfo
@@ -1200,14 +1225,14 @@
        
    return
def DoTurnFightPVE(guid, mapID, funcLineID, reqPlayerID, reqServerID, playerLineupDict, npcLineupIDList, strongerLV, difficulty):
def DoTurnFightPVE(guid, mapID, funcLineID, reqPlayerID, playerServerID, playerLineupDict, npcLineupIDList, strongerLV, difficulty):
    '''执行PVE战斗,支持多小队
    '''
    
    turnMax = GetTurnMax(mapID)
    
    tfMgr = GetTurnFightMgr()
    turnFight = tfMgr.addTurnFight(guid, mapID, funcLineID, reqPlayerID, reqServerID)
    turnFight = tfMgr.addTurnFight(guid, mapID, funcLineID, reqPlayerID, playerServerID)
    guid = turnFight.guid
    
    turnFight.setTurnFight(mapID, funcLineID, turnMax, True)
@@ -1232,7 +1257,7 @@
    tfMgr.delTurnFight(guid)
    return turnFight if saveOK else None
def DoTurnFightPVP(guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID=0, reqServerID=0):
def DoTurnFightPVP(guid, mapID, funcLineID, lineupDictA, lineupDictB, reqPlayerID=0, playerServerID=0):
    '''执行PVP战斗,只处理战斗,不关心功能及curPlayer相关
    @param lineupDictA: 阵营A所有阵容{阵容编号:{阵容信息}, ...}
    @param lineupDictB: 阵营B所有阵容{阵容编号:{阵容信息}, ...}
@@ -1242,7 +1267,7 @@
    turnMax = GetTurnMax(mapID)
    
    tfMgr = GetTurnFightMgr()
    turnFight = tfMgr.addTurnFight(guid, mapID, funcLineID, reqPlayerID, reqServerID)
    turnFight = tfMgr.addTurnFight(guid, mapID, funcLineID, reqPlayerID, playerServerID)
    guid = turnFight.guid
    
    turnFight.setTurnFight(mapID, funcLineID, turnMax, True)
@@ -1315,6 +1340,7 @@
        PlayerLLMJ.AddUseZhanchui(curPlayer, useZhanchui)
        PlayerPrestigeSys.AddRealmTaskValue(curPlayer, PlayerPrestigeSys.RealmTaskType_UseXiantao, useZhanchui)
        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_CutTree, useZhanchui)
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSACutTree, useZhanchui)
        PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_CutTree, useZhanchui)
        
    # 历练秘境额外经验
@@ -1327,6 +1353,7 @@
    if killNPCCnt > 0:
        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_KillNPC, killNPCCnt)
        PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_KillNPC, killNPCCnt)
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAKillNPC, killNPCCnt)
        
    # 结算逻辑最后重置数据
    mainFightMgr.resetMainFightExDataRec()
@@ -1992,7 +2019,7 @@
    funcLineID = turnFight.funcLineID
    GameWorld.DebugLog("--- 战斗结束处理 ---, winFaction=%s, costTime=%ss, %s" % (winFaction, turnFight.costTime, guid))
    if mapID != ChConfig.Def_FBMapID_Main:
        GameWorld.Log("战斗耗时: %ss, mapID=%s,funcLineID=%s" % (turnFight.costTime, mapID, funcLineID))
        GameWorld.Log("战斗耗时: %ss, mapID=%s,funcLineID=%s,turnNum=%s/%s" % (turnFight.costTime, mapID, funcLineID, turnFight.turnNum, turnFight.turnMax))
        
    # 统计明细
    batObjMgr = BattleObj.GetBatObjMgr()
@@ -2022,9 +2049,11 @@
                cureHP = batObj.cureStat
                batLineup.totalHurt += atkHurt
                batFaction.totalHurt += atkHurt
                dead = 0 if batObj.IsAlive() else 1
                GameWorld.DebugLog("    Pos:%s ID=%s,npcID=%s,heroID=%s,HP=%s/%s, 输出=%s,承伤=%s,治疗=%s" 
                                   % (posNum, objID, npcID, heroID, batObj.GetHP(), batObj.GetMaxHP(), atkHurt, defHurt, cureHP))
                lineupStatInfo[str(posNum)] = {"ObjID":objID, "HeroID":heroID, "NPCID":npcID, "AtkHurt":atkHurt, "DefHurt":defHurt, "CureHP":cureHP}
                lineupStatInfo[str(posNum)] = {"ObjID":objID, "HeroID":heroID, "NPCID":npcID, "AtkHurt":atkHurt, "DefHurt":defHurt, "CureHP":cureHP,
                                               "LV":batObj.GetLV(), "Star":batObj.GetStar(), "Skin":batObj.GetSkinID(), "Dead":dead}
                
    statMsg = {"winFaction":winFaction, "statInfo":statInfo}
    
@@ -2075,7 +2104,7 @@
    ReportRoot = "C:\TurnFightReport"
    
    dateStr = GameWorld.ChangeTimeNumToStr(int(time.time()), "%Y%m%d") 
    ReportDir = os.path.join(ReportRoot, "S%s" % reqServerID, dateStr, "%s" % reqPlayerID)
    ReportDir = os.path.join(ReportRoot, "S%s" % reqServerID, dateStr, "%s" % reqPlayerID, "%s" % turnFight.mapID)
    if not os.path.exists(ReportDir):
        os.makedirs(ReportDir)
    else:
@@ -2088,19 +2117,13 @@
                pass
            
    saveFilePath = os.path.join(ReportDir, "%s.tfr" % guid)
    GameWorld.DebugLog("__saveBatBuffer=%s" % saveFilePath)
    GameWorld.DebugLog("战报路径=%s" % saveFilePath)
    
    try:
        batBuffer = CommFunc.B2Hex(turnFight.batBuffer, False, False)
        GameWorld.DebugLog("batBuffer=%s,%s" % (len(batBuffer), batBuffer))
        clientPack = ChPyNetSendPack.tagSCTurnFightReport()
        clientPack.GUID = guid
        clientPack.Report = turnFight.batBuffer
        clientPack.Len = len(clientPack.Report)
        packBuffer = CommFunc.B2Hex(clientPack.GetBuffer(), False, False)
        GameWorld.DebugLog("packBuffer=%s,%s" % (len(packBuffer), packBuffer))
        fp = open(saveFilePath, "wb")
        fp.write(clientPack.GetBuffer())
        fp.close()