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