hxp
2024-04-10 a9415978e2c4b94debfb59787771e1434a1adf19
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -35,6 +35,7 @@
import FBCommon
import ItemControler
import PassiveBuffEffMng
import FBLogic
# 回合战斗流程状态
(
@@ -69,13 +70,60 @@
#    tagHead        Head;
#    DWORD        MapID;    // 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
#    WORD        FuncLineID;
#    DWORD        PlayerID;    // 对应玩家ID,可为0,某些功能可能有用,如竞技场
#    DWORD        PlayerID;    // 战斗目标玩家ID,可为0,某些功能可能有用,如竞技场
#    BYTE        ValueCount;
#    DWORD        ValueList[ValueCount]; // 附加值列表,可选,具体含义由MapID决定
#};
def OnTurnFight(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    mapID = clientData.MapID
    funcLineID = clientData.FuncLineID
    tagPlayerID = clientData.PlayerID
    valueList = clientData.ValueList
    playerID = curPlayer.GetPlayerID()
    if tagPlayerID:
        if playerID == tagPlayerID:
            GameWorld.DebugLog("不能打自己!", playerID)
            return
    if not FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList):
        return
    # 需要发送到GameServer验证
    if mapID in ChConfig.Def_TFMapID_SendToGameServer:
        SendToGameServer_TurnFight(curPlayer, "TurnFightRequest", [mapID, funcLineID, tagPlayerID, valueList])
        return
    DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick)
    return
def SendToGameServer_TurnFight(curPlayer, msgType, dataMsg=""):
    playerID = curPlayer.GetPlayerID()
    msgList = str([msgType, dataMsg])
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "TurnFight", msgList, len(msgList))
    GameWorld.Log("回合战斗发送GameServer: %s, %s" % (msgType, dataMsg), playerID)
    return
def GameServer_TurnFight_DoResult(curPlayer, msgData, tick):
    msgType, dataMsg, ret = msgData
    if not ret:
        return
    if msgType == "TurnFightRequest":
        mapID, funcLineID, tagPlayerID, valueList = dataMsg
        DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick)
    elif msgType == "TurnFightOver":
        mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList = dataMsg
        FBLogic.OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret)
    return
def DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick):
    ## 执行回合制战斗的完整流程
    
    if curPlayer.GetSightLevel() != curPlayer.GetID():
        PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
@@ -83,23 +131,23 @@
    SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Start)
    
    if tagPlayerID:
        PlayerViewCacheTube.GetPlayerPropDataCall(curPlayer, tagPlayerID, DoTrunFightVSPlayer, [mapID, funcLineID], True)
        PlayerViewCacheTube.GetPlayerPropDataCall(curPlayer, tagPlayerID, DoTrunFightVSPlayer, [mapID, funcLineID, valueList], True)
        return
    
    DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick)
    DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick)
    
    SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over)
    return
def DoTrunFightVSPlayer(curPlayer, tagPlayerID, callData, PropDict):
    mapID, funcLineID = callData
    mapID, funcLineID, valueList = callData
    if PropDict and curPlayer.GetPlayerID() != tagPlayerID:
        tick = GameWorld.GetGameWorld().GetTick()
        DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick)
        DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick)
    SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over)
    return
def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick):
def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick):
    playerID = curPlayer.GetPlayerID()
    factionInfoA = GetPlayerFactionInfoByCache(playerID)
    ipyData = None
@@ -121,20 +169,32 @@
        skillIDExList.extend(ipyData.GetSTSkillIDList())
        factionInfoB = {"npcID":npcID, "pet":petCacheInfo, "skillIDExList":skillIDExList}
        
    ret = ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, curPlayer)
    if not ret:
    fightRet = ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, curPlayer)
    if not fightRet:
        return
    isWin, turnNum, turnMax, factionTotalHurtDict, playbackID = ret
    isWin, turnNum, turnMax, factionTotalHurtDict, playbackID = fightRet
    
    # 结算奖励...待扩展
    awardItemList = []
    # 结算奖励, awardWay-发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑)
    needSendGameServer, awardItemList, awardWay = False, [], 1
    overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet)
    if overRet != None:
        needSendGameServer, awardItemList, awardWay = overRet
    if isWin and ipyData:
        # 山寨测试先默认都是首次奖励,正式后需删除
        awardItemList = ipyData.GetAwardItemListFirst()
        if awardWay == 1 and not awardItemList:
            # 山寨测试先默认都是首次奖励,正式后需删除
            awardItemList = ipyData.GetAwardItemListFirst()
    if awardItemList == None:
        awardItemList = []
        
    GameWorld.DebugLog("奖励物品: %s" % awardItemList)
    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}])
    if awardWay == 1 and awardItemList:
        ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}])
    if needSendGameServer or mapID in ChConfig.Def_TFMapID_SendToGameServer:
        SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList])
    overMsg = {"isWin":isWin, "itemInfo":FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)}
    playbackID and overMsg.update({"playbackID":playbackID})
    SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Award, turnNum, turnMax, overMsg)