From e6062b42c1191e9ab95e000a38276634eff0e1f1 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 27 九月 2023 02:57:09 +0800 Subject: [PATCH] 9949 【BT0.1】【主干】天星塔修改(全服奖励修改) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldSkyTower.py | 218 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 191 insertions(+), 27 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldSkyTower.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldSkyTower.py index 48d25e7..f83809d 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldSkyTower.py +++ b/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 -- Gitblit v1.8.0