hxp
2023-09-27 e6062b42c1191e9ab95e000a38276634eff0e1f1
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldSkyTower.py
@@ -17,12 +17,15 @@
import GameWorld
import ShareDefine
import PlayerUniversalGameRec
import ChPyNetSendPack
import NetPackCommon
import PlayerViewCache
import IpyGameDataPY
import time
ConfigExKey_SkyTowerPassPlayerIDList = "SkyTowerPassPlayerIDList"
def OnPlayerLogin(curPlayer):
    PlayerUniversalGameRec.SendUniversalGameRecInfo(curPlayer, ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
    Sync_SkyTowerPassPlayer(curPlayer)
    return
def __GetPassPlayerRecDataByFloorID(floorID):
@@ -38,47 +41,208 @@
        
    return recData
def MapServer_SkyTowerInfo(msgList):
def MapServer_SkyTowerInfo(curPlayer, msgList):
    ## 天星塔过关
    msgType, msgData = msgList
    
    # 过关
    if msgType == "ServerChallengePass":
        __OnServerChallengePass(msgData)
        return
        rankIndex = __OnServerChallengePass(curPlayer, msgData)
        return msgList + [rankIndex]
    
    # 领奖
    if msgType == "ServerChallengeReward":
        floorID = msgData[0]
        floorID, needPlayerCount, _ = msgData
        recData = __GetPassPlayerRecDataByFloorID(floorID)
        isPass = 1 if recData else 0
        return msgList + [isPass]
        passPlayerIDList = __GetPassPlayerIDList(recData)
        canGet = 1 if len(passPlayerIDList) >= needPlayerCount else 0
        return msgList + [canGet]
    # 合服首登
    if msgType == "MixFirstLogin":
        __OnMixFirstLogin(curPlayer, msgData)
        return
    
    return
def __OnServerChallengePass(msgData):
def __OnMixFirstLogin(curPlayer, msgData):
    playerID = curPlayer.GetPlayerID()
    passFloorInfo = msgData[0]
    GameWorld.Log("合服首登填充天星塔全服过关信息: %s" % passFloorInfo, playerID)
    syncRecDataList = []
    recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
    for index in xrange(recTypeListData.Count()):
        recData = recTypeListData.At(index)
        floorID = recData.GetValue1()
        if floorID not in passFloorInfo:
            continue
        maxNeedPassCount = passFloorInfo.pop(floorID)
        passPlayerIDList = __GetPassPlayerIDList(recData)
        if playerID in passPlayerIDList:
            continue
        if len(passPlayerIDList) >= maxNeedPassCount:
            continue
        __AddPassPlayerIDList(recData, passPlayerIDList, playerID)
        syncRecDataList.append(recData)
        GameWorld.Log("    添加天星塔过关记录: floorID=%s,passPlayerIDList=%s" % (floorID, passPlayerIDList), playerID)
    for floorID, maxNeedPassCount in passFloorInfo.items():
        recData = recTypeListData.AddRec()
        recData.SetValue1(floorID)
        passPlayerIDList = []
        __AddPassPlayerIDList(recData, passPlayerIDList, playerID)
        syncRecDataList.append(recData)
        GameWorld.Log("    新增天星塔过关记录: floorID=%s,passPlayerIDList=%s" % (floorID, passPlayerIDList), playerID)
    if syncRecDataList:
        Sync_SkyTowerPassPlayer(None, syncRecDataList)
    return
def __GetPassPlayerIDList(recData):
    strValue3 = recData.GetStrValue3()
    try:
        passPlayerIDList = eval(strValue3) if strValue3 else []
    except:
        passPlayerIDList = []
    return passPlayerIDList
def __AddPassPlayerIDList(recData, passPlayerIDList, playerID):
    isAdd = False
    if playerID not in passPlayerIDList:
        passPlayerIDList.append(playerID)
        isAdd = True
    updStr = str(passPlayerIDList).replace(" ", "")
    if len(updStr) > 255:
        passPlayerIDList.remove(playerID)
        updStr = str(passPlayerIDList).replace(" ", "")
        isAdd = False
    recData.SetStrValue3(updStr)
    if isAdd:
        SkyTowerPassPlayerIDList = IpyGameDataPY.GetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList)
        if SkyTowerPassPlayerIDList and playerID not in SkyTowerPassPlayerIDList:
            SkyTowerPassPlayerIDList.append(playerID)
            IpyGameDataPY.SetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList, SkyTowerPassPlayerIDList)
            GameWorld.DebugLog("__AddPassPlayerIDList SkyTowerPassPlayerIDList=%s" % SkyTowerPassPlayerIDList)
    return passPlayerIDList
def IsSkyTowerPassPlayer(playerID):
    SkyTowerPassPlayerIDList = IpyGameDataPY.GetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList)
    if not SkyTowerPassPlayerIDList:
        SkyTowerPassPlayerIDList = []
        recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
        for index in xrange(recTypeListData.Count()):
            recData = recTypeListData.At(index)
            passPlayerIDList = __GetPassPlayerIDList(recData)
            for pID in passPlayerIDList:
                if pID not in SkyTowerPassPlayerIDList:
                    SkyTowerPassPlayerIDList.append(pID)
        IpyGameDataPY.SetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList, SkyTowerPassPlayerIDList)
    GameWorld.DebugLog("IsSkyTowerPassPlayer SkyTowerPassPlayerIDList=%s" % SkyTowerPassPlayerIDList)
    return playerID in SkyTowerPassPlayerIDList
def __OnServerChallengePass(curPlayer, msgData):
    ## 全服挑战层过关
    floorID, playerID, playerName, job, playerLV, realmLV = msgData
    playerID = curPlayer.GetPlayerID()
    floorID, maxNeedPassCount, _ = msgData
    GameWorld.DebugLog("新增天星塔全服挑战层过关记录! floorID=%s,maxNeedPassCount=%s" % (floorID, maxNeedPassCount), playerID)
    
    recData = __GetPassPlayerRecDataByFloorID(floorID)
    if recData:
        GameWorld.DebugLog("该天星塔已经有人先过关了,不处理!floorID=%s" % floorID, playerID)
        return
    GameWorld.DebugLog("新增天星塔全服挑战层过关记录!floorID=%s" % floorID, playerID)
    if not recData:
        recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
        recData = recTypeListData.AddRec()
        recData.SetValue1(floorID)
    passPlayerIDList = __GetPassPlayerIDList(recData)
    if len(passPlayerIDList) >= maxNeedPassCount:
        return -1
    
    recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
    recData = recTypeListData.AddRec()
    recData.SetTime(int(time.time()))
    recData.SetValue1(floorID)
    recData.SetValue2(playerID)
    recData.SetValue3(playerLV)
    recData.SetValue4(job)
    recData.SetValue5(realmLV)
    recData.SetStrValue1(playerName)
    passPlayerIDList = __AddPassPlayerIDList(recData, passPlayerIDList, playerID)
    # 广播单条数据
    PlayerUniversalGameRec.SendUniversalGameRecSingle(None, recData)
    Sync_SkyTowerPassPlayer(None, [recData])
    return passPlayerIDList.index(playerID)
def GMAddRobotPassFloor(floorID, robotCount):
    recData = __GetPassPlayerRecDataByFloorID(floorID)
    if not recData:
        recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
        recData = recTypeListData.AddRec()
        recData.SetValue1(floorID)
    robotID = 0
    passPlayerIDList = __GetPassPlayerIDList(recData)
    for _ in range(robotCount):
        robotID += 1
        passPlayerIDList = __AddPassPlayerIDList(recData, passPlayerIDList, robotID)
    GameWorld.DebugLog("GM添加天星塔机器人过关全服层: floorID=%s,robotCount=%s,passPlayerIDList=%s"
                       % (floorID, robotCount, passPlayerIDList))
    # 广播单条数据
    Sync_SkyTowerPassPlayer(None, [recData])
    return
def GMClearPassFloor():
    recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
    recTypeListData.Clear()
    IpyGameDataPY.SetConfigEx(ConfigExKey_SkyTowerPassPlayerIDList, [])
    GameWorld.DebugLog("GM清空天星塔全服过关信息")
    return
def Sync_SkyTowerPassPlayer(curPlayer=None, recDataList=None):
    if recDataList == None:
        recDataList = []
        recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
        for index in xrange(recTypeListData.Count()):
            recDataList.append(recTypeListData.At(index))
    passFloorList = []
    passPlayerIDList = []
    for recData in recDataList:
        floorID = recData.GetValue1()
        playerIDList = __GetPassPlayerIDList(recData)
        for playerID in playerIDList:
            if playerID not in passPlayerIDList:
                passPlayerIDList.append(playerID)
        passFloorInfo = ChPyNetSendPack.tagGCSkyTowerPassFloor()
        passFloorInfo.FloorID= floorID
        passFloorInfo.PassPlayerIDList = playerIDList
        passFloorInfo.PassPlayerCount = len(passFloorInfo.PassPlayerIDList)
        passFloorList.append(passFloorInfo)
    if not passFloorList and not passPlayerIDList:
        return
    passPlayerList = []
    for playerID in passPlayerIDList:
        curCache = PlayerViewCache.FindViewCache(playerID)
        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache) if curCache else {}
        playerInfo = ChPyNetSendPack.tagGCSkyTowerPassPlayer()
        playerInfo.PlayerID = playerID
        playerInfo.PlayerName = ("robot%s" % playerID) if playerID < 1000 else cacheDict.get("Name", str(playerID))
        playerInfo.Job = cacheDict.get("Job", 1)
        playerInfo.LV = cacheDict.get("LV", 1)
        playerInfo.RealmLV = cacheDict.get("RealmLV", 0)
        passPlayerList.append(playerInfo)
    clientPack = ChPyNetSendPack.tagGCSkyTowerPassPlayerInfo()
    clientPack.Clear()
    clientPack.PassFloorList = passFloorList
    clientPack.FloorCount = len(clientPack.PassFloorList)
    clientPack.PassPlayerList = passPlayerList
    clientPack.PlayerCount = len(clientPack.PassPlayerList)
    if curPlayer:
        NetPackCommon.SendFakePack(curPlayer, clientPack)
    else:
        playerManager = GameWorld.GetPlayerManager()
        for i in range(0, playerManager.GetPlayerCount()):
            curPlayer = playerManager.GetPlayerByIndex(i)
            if curPlayer == None or not curPlayer.GetInitOK():
                continue
            NetPackCommon.SendFakePack(curPlayer, clientPack)
    return