ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MirrorBattle.py
@@ -15,22 +15,101 @@
#"""Version = 2024-10-17 15:00"""
#-------------------------------------------------------------------------------
import GameWorld
import ChConfig
import ShareDefine
import MirrorAttack
import PlayerControl
import IpyGameDataPY
import PlayerCrossRealmPK
import CrossRealmPlayer
import PlayerArena
import GameWorld
import FBCommon
import GameObj
## 是否能够通过活动查询进入
def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
    return True
def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
    return MirrorAttack.OnGetMirrorBattlePos(mapID, lineId)[0]
## 客户端进入自定义场景
def OnEnterCustomScene(curPlayer, mapID, lineID):
def DoEnterFB(curPlayer, tick):
    playerID = curPlayer.GetPlayerID()
    GameWorld.Log("---------------- 镜像战斗DoEnterFB ----------------", playerID)
    MirrorAttack.OnMirrorBattleEnterMapInit(curPlayer, tick)
    return
def DoExitFB(curPlayer, tick):
    ##玩家退出副本
    MirrorAttack.DoExitFB(curPlayer, tick)
    return
def DoPlayerLeaveFB(curPlayer, tick):
    ##玩家主动离开副本
    MirrorAttack.DoPlayerLeaveFB(curPlayer, tick)
    return
def CheckPlayersRelation_IsFriend(curPlayer, curTagPlayer):
    return not CanAttackPlayer(curPlayer, curTagPlayer)
def CanAttackPlayer(curPlayer, curTagPlayer):
    battle = MirrorAttack.GetMirrorBattle(curPlayer)
    if not battle:
        return
    if battle.batState != ChConfig.Def_MirrorBatState_Fight:
        return
    if curTagPlayer:
        if curPlayer.GetFaction() == curTagPlayer.GetFaction():
            return
    return True
##处理副本中杀死玩家逻辑
def DoFBOnKill_Player(atkobj, defender, tick):
    GameWorld.DebugLog("镜像切磋击杀玩家: defID=%s" % (defender.GetID()), atkobj.GetID())
    return True
def OnMirrorBattleRequest(curPlayer, mapID, funcLineID, factionPlayerList):
    ## 镜像战斗请求
    if mapID == ChConfig.Def_FBMapID_CrossRealmPK:
        return __CheckRequest_CrossRealmPK(curPlayer, mapID, funcLineID)
    if mapID == ChConfig.Def_FBMapID_CrossChampionship:
        return __CheckRequest_CrossChampionship(curPlayer, mapID, funcLineID)
    return True
def __CheckRequest_CrossRealmPK(curPlayer, mapID, funcLineID):
    if not CrossRealmPlayer.IsCrossServerOpen():
        PlayerControl.NotifyCode(curPlayer, "CrossMatching18")
        return
    if not PlayerCrossRealmPK.CheckCanMatch(curPlayer):
        return
    if not PlayerCrossRealmPK.CheckHavePKCount(curPlayer):
        return
    return True
def __CheckRequest_CrossChampionship(curPlayer, mapID, funcLineID):
    playerID = curPlayer.GetPlayerID()
    if not CrossRealmPlayer.IsCrossServerOpen():
        PlayerControl.NotifyCode(curPlayer, "CrossMatching18")
        return
    stateError = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossChampionshipStateError)
    if stateError:
        GameWorld.ErrLog("跨服排位状态已经异常无法进入! stateError=%s" % stateError, playerID)
        return
    state = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossChampionshipState)
    if state not in ShareDefine.CrossChampionshipEnterStateInfo:
        GameWorld.ErrLog("当前状态非跨服排位战斗状态无法进入: state=%s" % state, playerID)
        return
    groupMark = ShareDefine.CrossChampionshipEnterStateInfo[state]
    reqGroupMark = funcLineID % 100
    if reqGroupMark != groupMark:
        GameWorld.ErrLog("当前状态与跨服排位战斗分组不一致无法进入: funcLineID=%s,reqGroupMark=%s != %s" % (funcLineID, reqGroupMark, groupMark), playerID)
        return
    return True
def OnMirrorBattleOver(battleID):
@@ -39,35 +118,73 @@
    battle = MirrorAttack.GetMirrorBattleByID(battleID)
    if not battle:
        return
    isLogout = battle.isLogout
    mapID = battle.mapID
    funcLineID = battle.funcLineID
    winFaction = battle.winFaction
    curPlayerID = battle.requestID # 副本所属玩家ID,该玩家不一定参与实际战斗
    curIsWin = 0
    GameWorld.DebugLog("镜像战斗结算: mapID=%s,funcLineID=%s,winFaction=%s,isLogout=%s" % (mapID, funcLineID, winFaction, isLogout), battleID)
    playerMgr = GameWorld.GetMapCopyPlayerManager()
    for playerID, faction in battle.playerFactionDict.items():
        curPlayer = playerMgr.FindPlayerByID(playerID)
        if not curPlayer:
            continue
        realPlayerID = curPlayer.GetRealPlayerID()
        isWin = (faction == winFaction)
        GameWorld.DebugLog("剩余血量: %s/%s,playerID=%s,realPlayerID=%s,faction=%s,isWin=%s"
                           % (GameObj.GetHP(curPlayer), GameObj.GetMaxHP(curPlayer), playerID, realPlayerID, faction, isWin), battleID)
        if isWin and faction == 1:
            curIsWin = 1
    if not curPlayerID:
        return
    curPlayer = playerMgr.FindPlayerByID(curPlayerID)
    isWin = battle.isWin
    curPlayerID = battle.playerID # 副本所属玩家ID,该玩家不一定参与实际战斗
    tagPlayerID = battle.GetTagPlayerID()
    curPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(curPlayerID)
    if not curPlayer:
        return
    # 结算奖励,通知结果
    if mapID == ChConfig.Def_FBMapID_ArenaBattle:
        arenaPlayerID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleTagID)
        if tagPlayerID == arenaPlayerID:
            PlayerArena.SendGameServer_ArenaBattleOver(curPlayer, isWin)
        else:
            GameWorld.DebugLog("非竞技场对手不结算! tagPlayerID=%s,arenaPlayerID=%s" % (tagPlayerID, arenaPlayerID), curPlayerID)
        return
    if mapID == ChConfig.Def_FBMapID_CrossRealmPK:
        PlayerCrossRealmPK.SendPKOver(curPlayer, tagPlayerID, isWin)
        return
    if mapID == ChConfig.Def_FBMapID_CrossChampionship:
        __MirrorBattleOver_CrossChampionship(curPlayer, battle)
        return
    giveItemList = []
    overDict = {"isWin":curIsWin, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}
    FBCommon.NotifyFBOver(curPlayer, mapID, funcLineID, isWin, overDict)
    overDict = {"isWin":isWin, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}
    FBCommon.NotifyFBOver(curPlayer, mapID, funcLineID, isWin, overDict)
    return
def __MirrorBattleOver_CrossChampionship(curPlayer, battle):
    playerID = curPlayer.GetPlayerID()
    mapID = battle.mapID
    funcLineID = battle.funcLineID
    isWin = battle.isWin
    tagPlayerID = battle.GetTagPlayerID()
    curHPPer, tagHPPer = battle.CalcHPPer()
    remainTimePer = battle.CalcRemainTimePer()
    baseScoreList = IpyGameDataPY.GetFuncEvalCfg("CrossChamMirrorPK", 2)
    baseScore = 0
    if baseScoreList and len(baseScoreList) == 2:
        baseScore = baseScoreList[0] if isWin else baseScoreList[1]
    hpScore = int(eval(IpyGameDataPY.GetFuncCompileCfg("CrossChamMirrorPK", 3)))
    GameWorld.DebugLog("    hpScore=%s,curHPPer=%s,tagHPPer=%s" % (hpScore, curHPPer, tagHPPer), playerID)
    timeScore = int(eval(IpyGameDataPY.GetFuncCompileCfg("CrossChamMirrorPK", 4)))
    GameWorld.DebugLog("    timeScore=%s,remainTimePer=%s%%" % (timeScore, remainTimePer), playerID)
    addScore = baseScore + hpScore + timeScore
    GameWorld.DebugLog("    addScore=%s,baseScore=%s" % (addScore, baseScore), playerID)
    pkCountMax = IpyGameDataPY.GetFuncCfg("CrossChamMirrorPK", 1)
    playerID = curPlayer.GetPlayerID()
    dataMsg = {
               "playerID":playerID,
               "tagPlayerID":tagPlayerID,
               "funcLineID":funcLineID,
               "isWin":isWin,
               "addScore":addScore,
               "baseScore":baseScore,
               "hpScore":hpScore,
               "timeScore":timeScore,
               "pkCountMax":pkCountMax,
               }
    GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChampionshipPKOver, dataMsg)
    overDict = {"isWin":isWin, "tagPlayerID":tagPlayerID, "addScore":addScore, "baseScore":baseScore, "hpScore":hpScore, "timeScore":timeScore}
    FBCommon.NotifyFBOver(curPlayer, mapID, funcLineID, isWin, overDict)
    return