| | |
| | |
|
| | | 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):
|
| | |
| | |
|
| | | 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.SetTime(int(time.time()))
|
| | | recData.SetValue1(floorID)
|
| | | recData.SetValue2(playerID)
|
| | | recData.SetValue3(playerLV)
|
| | | recData.SetValue4(job)
|
| | | recData.SetValue5(realmLV)
|
| | | recData.SetStrValue1(playerName)
|
| | |
|
| | | passPlayerIDList = __GetPassPlayerIDList(recData)
|
| | | if len(passPlayerIDList) >= maxNeedPassCount:
|
| | | return -1
|
| | | |
| | | 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
|