#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package GameWorldSkyTower
|
#
|
# @todo:ÌìÐÇËþ
|
# @author hxp
|
# @date 2020Äê03ÔÂ02ÈÕ
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ÌìÐÇËþ
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2020Äê03ÔÂ02ÈÕ 20:00"""
|
#-------------------------------------------------------------------------------
|
|
import GameWorld
|
import ShareDefine
|
import ChPyNetSendPack
|
import NetPackCommon
|
import PlayerViewCache
|
import IpyGameDataPY
|
|
ConfigExKey_SkyTowerPassPlayerIDList = "SkyTowerPassPlayerIDList"
|
|
def OnPlayerLogin(curPlayer):
|
Sync_SkyTowerPassPlayer(curPlayer)
|
return
|
|
def __GetPassPlayerRecDataByFloorID(floorID):
|
## »ñÈ¡¹ý¹Ø²ã¼Ç¼Êý¾Ý
|
recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_SkyTowerPassPlayer)
|
|
recData = None
|
for index in xrange(recTypeListData.Count()):
|
universalRecData = recTypeListData.At(index)
|
if universalRecData.GetValue1() == floorID:
|
recData = universalRecData
|
break
|
|
return recData
|
|
def MapServer_SkyTowerInfo(curPlayer, msgList):
|
## ÌìÐÇËþ¹ý¹Ø
|
msgType, msgData = msgList
|
|
# ¹ý¹Ø
|
if msgType == "ServerChallengePass":
|
rankIndex = __OnServerChallengePass(curPlayer, msgData)
|
return msgList + [rankIndex]
|
|
# Áì½±
|
if msgType == "ServerChallengeReward":
|
floorID, needPlayerCount, _ = msgData
|
recData = __GetPassPlayerRecDataByFloorID(floorID)
|
passPlayerIDList = __GetPassPlayerIDList(recData)
|
canGet = 1 if len(passPlayerIDList) >= needPlayerCount else 0
|
return msgList + [canGet]
|
|
# ºÏ·þÊ×µÇ
|
if msgType == "MixFirstLogin":
|
__OnMixFirstLogin(curPlayer, msgData)
|
return
|
|
return
|
|
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):
|
## È«·þÌôÕ½²ã¹ý¹Ø
|
playerID = curPlayer.GetPlayerID()
|
floorID, maxNeedPassCount, _ = msgData
|
GameWorld.DebugLog("ÐÂÔöÌìÐÇËþÈ«·þÌôÕ½²ã¹ý¹Ø¼Ç¼! floorID=%s,maxNeedPassCount=%s" % (floorID, maxNeedPassCount), playerID)
|
|
recData = __GetPassPlayerRecDataByFloorID(floorID)
|
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
|
|
passPlayerIDList = __AddPassPlayerIDList(recData, passPlayerIDList, playerID)
|
# ¹ã²¥µ¥ÌõÊý¾Ý
|
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)
|
playerInfo.Face = cacheDict.get("Face", 0)
|
playerInfo.FacePic = cacheDict.get("FacePic", 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
|