hxp
2024-09-18 d0d6f28bee730ee64bf46adffa4f768d6af6ac0c
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Championship.py
@@ -19,6 +19,7 @@
import CrossChampionship
import PlayerDBGSEvent
import ShareDefine
import time
#逻辑实现
@@ -44,6 +45,9 @@
        GameWorld.DebugAnswer(curPlayer, "如果没有指定ID则该组重新随机匹配")
        GameWorld.DebugAnswer(curPlayer, "命令需在对应的阶段设置才有效;")
        GameWorld.DebugAnswer(curPlayer, "重置活动数据需在非活动时间重置,不然可能导致活动状态异常")
        GameWorld.DebugAnswer(curPlayer, "虚拟结算排名: Championship 8 分区 第1名ID ...")
        GameWorld.DebugAnswer(curPlayer, "虚拟结算执行: Championship over")
        GameWorld.DebugAnswer(curPlayer, "注:虚拟结算的命令主要用于快速测试结算用,玩家ID不足则假人代替")
        
    else:
        value1 = gmList[0]
@@ -78,7 +82,7 @@
    
    state = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState)
    champMgr = CrossChampionship.GetChampionshipMgr()
    pkZoneIDList = champMgr.GetChampPKZoneIDList()
    #pkZoneIDList = champMgr.GetChampPKZoneIDList()
    if value1 == 0:
        if state in ShareDefine.CrossChampionshipStateList and state != ShareDefine.CrossChampionshipStateList[0]:
            GameWorld.DebugAnswerCross(playerID, serverGroupID, "重置数据需在非活动中或64强分组前")
@@ -89,6 +93,7 @@
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID, 0)
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState, 0)
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, 0)
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo, 0)
        
        champMgr.ClearPKZone()
        if isResetOfficial:
@@ -119,15 +124,15 @@
        zoneID = gmList[1]
        batPlayerCount = min(maxPlayerCount, gmList[2])
        setPlayerIDList = gmList[3:]
        if zoneID not in pkZoneIDList:
        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
        if not pkZoneMgr:
            GameWorld.DebugAnswerCross(playerID, serverGroupID, "不存在该分区!zoneID=%s" % zoneID)
            return
        if len(setPlayerIDList) < batPlayerCount:
            # 不足的机器人补足
            setPlayerIDList += range(1001, 1001 + (batPlayerCount - len(setPlayerIDList)))
        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
        pkZoneMgr.playerDict = {} # 清空玩家,重新设置
        CrossChampionship.Send_CrossServerMsg_ChampionshipPlayer(isSync=True)
        CrossChampionship.Send_CrossServerMsg_ChampionshipPlayer(isSync=True, clearPlayer=True)
        for pID in setPlayerIDList:
            batPlayer = CrossChampionship.ChampionshipBatPlayer()
            batPlayer.zoneID = zoneID
@@ -149,6 +154,9 @@
        zoneID = gmList[1]
        groupPlayerIDList = gmList[2:]
        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
        if not pkZoneMgr:
            GameWorld.DebugAnswerCross(playerID, serverGroupID, "不存在该分区!zoneID=%s" % zoneID)
            return
        if not groupPlayerIDList:
            pkZoneMgr.battleInfo.pop(groupMark, None)
            CrossChampionship.DoCrossChampionshipGroupRand(groupMark)
@@ -203,7 +211,57 @@
        CrossChampionship.Send_CrossServerMsg_ChampionshipGroup(groupMark)
        return
    
    if value1 == 8:
        __FackOverData(playerID, serverGroupID, gmList)
        return
    if value1 == "over":
        GameWorld.DebugAnswerCross(playerID, serverGroupID, "虚拟结算执行")
        CrossChampionship.DoCrossChampionshipFinalOver()
        return
    GameWorld.DebugAnswerCross(playerID, serverGroupID, "命令参数错误,详见命令说明")
    return
def __FackOverData(playerID, serverGroupID, gmList):
    ## 虚拟结算数据
    zoneID = gmList[1] if len(gmList) > 1 else 0
    rankPlayerIDList = gmList[2:]
    batPlayerCount = CrossChampionship.Def_CrossChampionshipPlayerWFCount
    # 先设置参赛玩家
    champMgr = CrossChampionship.GetChampionshipMgr()
    pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True)
    if len(rankPlayerIDList) < batPlayerCount:
        # 不足的机器人补足
        zonePlayerIDStar = zoneID * 100 + 1 # 确保每个分区的假人不重复
        rankPlayerIDList += range(zonePlayerIDStar, zonePlayerIDStar + (batPlayerCount - len(rankPlayerIDList)))
    pkZoneMgr.playerDict = {} # 清空玩家,重新设置
    CrossChampionship.Send_CrossServerMsg_ChampionshipPlayer(isSync=True, clearPlayer=True)
    for pID in rankPlayerIDList:
        batPlayer = CrossChampionship.ChampionshipBatPlayer()
        batPlayer.zoneID = zoneID
        batPlayer.playerID = pID
        pkZoneMgr.playerDict[pID] = batPlayer
    CrossChampionship.Send_CrossServerMsg_ChampionshipPlayer(isSync=True)
    # 虚拟战斗场次
    overTime = int(time.time())
    pkZoneMgr.battleInfo = {} # 清空对战记录
    battleIndexDict = {8:[[1, 5], [3, 7], [2, 6], [4, 8]], 4:[[1, 3], [5, 7], [2, 4], [6, 8]], 2:[[1, 2], [3, 4], [5, 6], [7, 8]]}
    for groupMark in [8, 4, 2]:
        battleList = battleIndexDict[groupMark]
        for battleNum in range(1, 1 + len(battleList)):
            battleRankInfo = battleList[battleNum - 1]
            battle = CrossChampionship.ChampionshipBattle()
            battle.overTime = overTime
            battle.zoneID = zoneID
            battle.groupMark = groupMark
            battle.battleNum = battleNum
            battle.playerIDA = rankPlayerIDList[battleRankInfo[0] - 1]
            battle.playerIDB = rankPlayerIDList[battleRankInfo[1] - 1]
            battle.winPlayerID = battle.playerIDA
            pkZoneMgr.AddBattle(groupMark, battleNum, battle)
        CrossChampionship.Send_CrossServerMsg_ChampionshipGroup(groupMark)
    GameWorld.DebugAnswerCross(playerID, serverGroupID, "虚拟结算排名:分区%s,%s" % (zoneID, rankPlayerIDList))
    return
def __PrintChampionshipInfo():
@@ -216,6 +274,8 @@
    GameWorld.Log("ID=%s,state=%s,stateError=%s,pkZoneIDList=%s" % (ID, state, stateError, pkZoneIDList))
    for zoneID in pkZoneIDList:
        pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID)
        if not pkZoneMgr:
            continue
        
#            self.guessInfo = {} # 竞猜信息 {竞猜类型:[ChampionshipGuess, ...], ...}
#            self.superPlayerCountInfo = {} # {竞猜类型:{playerID:支持人数, ...}, ...}
@@ -246,8 +306,8 @@
            for guessPlayerID, guessObjList in playerGuessDict.items():
                GameWorld.Log("    guessPlayerID=%s,guessObjListLen=%s" % (guessPlayerID, len(guessObjList)))
                for guessObj in guessObjList:
                    GameWorld.Log("        guessPlayerID=%s,tagPlayerID=%s,moneyTotal=%s,guessRank=%s"
                                  % (guessPlayerID, guessObj.tagPlayerID, guessObj.moneyTotal, guessObj.guessRank))
                    GameWorld.Log("        guessPlayerID=%s,tagPlayerID=%s,moneyTotal=%s,guessRank=%s,isClose=%s"
                                  % (guessPlayerID, guessObj.tagPlayerID, guessObj.moneyTotal, guessObj.guessRank, guessObj.isClose))
            GameWorld.Log("    ===")
            
    offZoneIDList = champMgr.GetChampOfficialZoneIDList()