9949 【BT0.1】【主干】天星塔修改(全服奖励修改)
| | |
| | | struct tagSkyTowerServerChallenge
|
| | | {
|
| | | DWORD _FloorID; //层
|
| | | BYTE RewardRecordIndex; //奖励记录位索引
|
| | | dict Reward; //奖励
|
| | | dict PassRankRewardInfo; //通关排名奖励 {"名次":[[物品ID,个数,是否拍品],...], ...}
|
| | | dict ServerRewardInfo; //通关排名奖励 {"所需过关人数":[[物品ID,个数,是否拍品],...], ...}
|
| | | };
|
| | |
|
| | | //灵根特效表
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A9 AD 通知天星塔全服奖励通关玩家信息 #tagGCSkyTowerPassPlayerInfo
|
| | |
|
| | | class tagGCSkyTowerPassPlayer(Structure):
|
| | | PlayerID = 0 #(DWORD PlayerID)
|
| | | PlayerName = "" #(char PlayerName[33])
|
| | | Job = 0 #(BYTE Job)
|
| | | LV = 0 #(WORD LV)//等级
|
| | | RealmLV = 0 #(WORD RealmLV)//境界
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.PlayerName,_pos = CommFunc.ReadString(_lpData, _pos,33)
|
| | | self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.PlayerID = 0
|
| | | self.PlayerName = ""
|
| | | self.Job = 0
|
| | | self.LV = 0
|
| | | self.RealmLV = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += 4
|
| | | length += 33
|
| | | length += 1
|
| | | length += 2
|
| | | length += 2
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteDWORD(data, self.PlayerID)
|
| | | data = CommFunc.WriteString(data, 33, self.PlayerName)
|
| | | data = CommFunc.WriteBYTE(data, self.Job)
|
| | | data = CommFunc.WriteWORD(data, self.LV)
|
| | | data = CommFunc.WriteWORD(data, self.RealmLV)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | PlayerID:%d,
|
| | | PlayerName:%s,
|
| | | Job:%d,
|
| | | LV:%d,
|
| | | RealmLV:%d
|
| | | '''\
|
| | | %(
|
| | | self.PlayerID,
|
| | | self.PlayerName,
|
| | | self.Job,
|
| | | self.LV,
|
| | | self.RealmLV
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagGCSkyTowerPassFloor(Structure):
|
| | | FloorID = 0 #(DWORD FloorID)// 层ID
|
| | | PassPlayerCount = 0 #(BYTE PassPlayerCount)// 通关记录玩家数
|
| | | PassPlayerIDList = list() #(vector<DWORD> PassPlayerIDList)// 通关记录玩家ID列表 [第1个通过玩家ID, 第2个, ...]
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | self.FloorID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.PassPlayerCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.PassPlayerCount):
|
| | | value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
|
| | | self.PassPlayerIDList.append(value)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.FloorID = 0
|
| | | self.PassPlayerCount = 0
|
| | | self.PassPlayerIDList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += 4
|
| | | length += 1
|
| | | length += 4 * self.PassPlayerCount
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteDWORD(data, self.FloorID)
|
| | | data = CommFunc.WriteBYTE(data, self.PassPlayerCount)
|
| | | for i in range(self.PassPlayerCount):
|
| | | data = CommFunc.WriteDWORD(data, self.PassPlayerIDList[i])
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | FloorID:%d,
|
| | | PassPlayerCount:%d,
|
| | | PassPlayerIDList:%s
|
| | | '''\
|
| | | %(
|
| | | self.FloorID,
|
| | | self.PassPlayerCount,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagGCSkyTowerPassPlayerInfo(Structure):
|
| | | Head = tagHead()
|
| | | FloorCount = 0 #(WORD FloorCount)
|
| | | PassFloorList = list() #(vector<tagGCSkyTowerPassFloor> PassFloorList)// 通关塔层信息列表
|
| | | PlayerCount = 0 #(WORD PlayerCount)
|
| | | PassPlayerList = list() #(vector<tagGCSkyTowerPassPlayer> PassPlayerList)// 通关玩家信息列表
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA9
|
| | | self.Head.SubCmd = 0xAD
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.FloorCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | for i in range(self.FloorCount):
|
| | | temPassFloorList = tagGCSkyTowerPassFloor()
|
| | | _pos = temPassFloorList.ReadData(_lpData, _pos)
|
| | | self.PassFloorList.append(temPassFloorList)
|
| | | self.PlayerCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | for i in range(self.PlayerCount):
|
| | | temPassPlayerList = tagGCSkyTowerPassPlayer()
|
| | | _pos = temPassPlayerList.ReadData(_lpData, _pos)
|
| | | self.PassPlayerList.append(temPassPlayerList)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA9
|
| | | self.Head.SubCmd = 0xAD
|
| | | self.FloorCount = 0
|
| | | self.PassFloorList = list()
|
| | | self.PlayerCount = 0
|
| | | self.PassPlayerList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 2
|
| | | for i in range(self.FloorCount):
|
| | | length += self.PassFloorList[i].GetLength()
|
| | | length += 2
|
| | | for i in range(self.PlayerCount):
|
| | | length += self.PassPlayerList[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteWORD(data, self.FloorCount)
|
| | | for i in range(self.FloorCount):
|
| | | data = CommFunc.WriteString(data, self.PassFloorList[i].GetLength(), self.PassFloorList[i].GetBuffer())
|
| | | data = CommFunc.WriteWORD(data, self.PlayerCount)
|
| | | for i in range(self.PlayerCount):
|
| | | data = CommFunc.WriteString(data, self.PassPlayerList[i].GetLength(), self.PassPlayerList[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | FloorCount:%d,
|
| | | PassFloorList:%s,
|
| | | PlayerCount:%d,
|
| | | PassPlayerList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.FloorCount,
|
| | | "...",
|
| | | self.PlayerCount,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagGCSkyTowerPassPlayerInfo=tagGCSkyTowerPassPlayerInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCSkyTowerPassPlayerInfo.Head.Cmd,m_NAtagGCSkyTowerPassPlayerInfo.Head.SubCmd))] = m_NAtagGCSkyTowerPassPlayerInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A9 06 商城全服购买次数通知 #tagGCStoreServerBuyCntInfo
|
| | |
|
| | | class tagGCStoreServerBuyCnt(Structure):
|
| | |
| | | #------------------------------------------------------
|
| | | # B2 13 天星塔通关层数 #tagMCSkyTowerInfo
|
| | |
|
| | | class tagMCSkyTowerInfo(Structure):
|
| | | class tagMCSkyTowerServerReward(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("Floor", c_int), # 已通关层
|
| | | ("ServerRewardRecord", c_int), #全服挑战层领奖记录,按奖励记录二进制位存储是否已领取
|
| | | ("Floor", c_int), # 全服奖励层ID
|
| | | ("ServerRewardRecord", c_int), #该层全服领奖记录,按所需人数作为二进制位进行位运算判断是否已领取
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB2
|
| | | self.SubCmd = 0x13
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | |
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.Cmd = 0xB2
|
| | | self.SubCmd = 0x13
|
| | | self.Floor = 0
|
| | | self.ServerRewardRecord = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCSkyTowerInfo)
|
| | | return sizeof(tagMCSkyTowerServerReward)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B2 13 天星塔通关层数 //tagMCSkyTowerInfo:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | Floor:%d,
|
| | | ServerRewardRecord:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.Floor,
|
| | | self.ServerRewardRecord
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagMCSkyTowerInfo(Structure):
|
| | | Head = tagHead()
|
| | | Floor = 0 #(DWORD Floor)// 已通关层
|
| | | ServerRewardCount = 0 #(WORD ServerRewardCount)
|
| | | ServerRewardList = list() #(vector<tagMCSkyTowerServerReward> ServerRewardList)// 全服奖励领取记录列表,下发的层记录替换更新即可,领奖记录没有变化时服务端不会下发
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xB2
|
| | | self.Head.SubCmd = 0x13
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.Floor,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.ServerRewardCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | for i in range(self.ServerRewardCount):
|
| | | temServerRewardList = tagMCSkyTowerServerReward()
|
| | | _pos = temServerRewardList.ReadData(_lpData, _pos)
|
| | | self.ServerRewardList.append(temServerRewardList)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xB2
|
| | | self.Head.SubCmd = 0x13
|
| | | self.Floor = 0
|
| | | self.ServerRewardCount = 0
|
| | | self.ServerRewardList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 2
|
| | | for i in range(self.ServerRewardCount):
|
| | | length += self.ServerRewardList[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.Floor)
|
| | | data = CommFunc.WriteWORD(data, self.ServerRewardCount)
|
| | | for i in range(self.ServerRewardCount):
|
| | | data = CommFunc.WriteString(data, self.ServerRewardList[i].GetLength(), self.ServerRewardList[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | Floor:%d,
|
| | | ServerRewardCount:%d,
|
| | | ServerRewardList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.Floor,
|
| | | self.ServerRewardCount,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCSkyTowerInfo=tagMCSkyTowerInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSkyTowerInfo.Cmd,m_NAtagMCSkyTowerInfo.SubCmd))] = m_NAtagMCSkyTowerInfo
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSkyTowerInfo.Head.Cmd,m_NAtagMCSkyTowerInfo.Head.SubCmd))] = m_NAtagMCSkyTowerInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
New file |
| | |
| | | #!/usr/bin/python |
| | | # -*- coding: GBK -*- |
| | | #------------------------------------------------------------------------------- |
| | | # |
| | | ##@package GM.Commands.SetSkyTower |
| | | # |
| | | # @todo:天星塔 |
| | | # @author hxp |
| | | # @date 2023-09-27 |
| | | # @version 1.0 |
| | | # |
| | | # 详细描述: 天星塔 |
| | | # |
| | | #------------------------------------------------------------------------------- |
| | | #"""Version = 2023-09-27 03:00""" |
| | | #------------------------------------------------------------------------------- |
| | | |
| | | import GameWorld |
| | | import GameWorldSkyTower |
| | | |
| | | ## 逻辑实现 |
| | | ## GM命令执行入口 |
| | | # @param curPlayer |
| | | # @param cmdList 参数列表 |
| | | # @return None |
| | | def OnExec(curPlayer, cmdList): |
| | | if not cmdList: |
| | | return |
| | | cmdType = cmdList[0] |
| | | GameWorld.DebugLog("SetSkyTower %s" % cmdList) |
| | | if cmdType == 2: |
| | | floorID = cmdList[1] if len(cmdList) > 1 else 0 |
| | | robotCount = cmdList[2] if len(cmdList) > 2 else 1 |
| | | GameWorldSkyTower.GMAddRobotPassFloor(floorID, robotCount) |
| | | elif cmdType == 4: |
| | | GameWorldSkyTower.GMClearPassFloor() |
| | | |
| | | return |
| | |
| | |
|
| | | 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.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
|
| | |
| | |
|
| | | # 天星塔
|
| | | if callName == "SkyTower":
|
| | | ret = GameWorldSkyTower.MapServer_SkyTowerInfo(eval(resultName))
|
| | | curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
|
| | | if not curPlayer:
|
| | | return
|
| | | ret = GameWorldSkyTower.MapServer_SkyTowerInfo(curPlayer, eval(resultName))
|
| | | if ret == None:
|
| | | return
|
| | | resultName = '%s' % ret
|
| | |
| | | import GameWorldArena
|
| | | import ChPyNetSendPack
|
| | | import PlayerFBHelpBattle
|
| | | import GameWorldSkyTower
|
| | | import CrossChampionship
|
| | | import CrossBattlefield
|
| | | import PyGameDataStruct
|
| | |
| | | if CrossChampionship.IsChampionshipPlayer(playerID):
|
| | | return True
|
| | |
|
| | | if GameWorldSkyTower.IsSkyTowerPassPlayer(playerID):
|
| | | return True
|
| | | |
| | | SaveDBLimitLV = IpyGameDataPY.GetFuncCfg("PlayerViewCache", 1)
|
| | | #校验玩家等级
|
| | | if playerLV < SaveDBLimitLV:
|
| | |
| | | Def_Player_Dict_TrialTower_LastDayPassLV = "Tower_LastDayPassLV" # 试炼之塔昨日通关层数
|
| | | #天星塔
|
| | | Def_Player_Dict_SkyTowerFloor = "SkyTowerFloor" # 天星塔已通关层数
|
| | | Def_Player_Dict_SkyTowerChallengeRewardRecord = "SkyTowerChallengeRewardRecord" # 天星塔全服挑战层领奖记录,按奖励记录位二进制存储
|
| | | Def_Player_Dict_SkyTowerServerRecord = "SkyTowerServerRecord_%s" # 天星塔全服挑战层领奖记录,参数(层)
|
| | |
|
| | | #古神禁地
|
| | | Def_Player_Dict_GodArea_Anger = "GodArea_Anger" # 古神禁地怒气值
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A9 AD 通知天星塔全服奖励通关玩家信息 #tagGCSkyTowerPassPlayerInfo
|
| | |
|
| | | class tagGCSkyTowerPassPlayer(Structure):
|
| | | PlayerID = 0 #(DWORD PlayerID)
|
| | | PlayerName = "" #(char PlayerName[33])
|
| | | Job = 0 #(BYTE Job)
|
| | | LV = 0 #(WORD LV)//等级
|
| | | RealmLV = 0 #(WORD RealmLV)//境界
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.PlayerName,_pos = CommFunc.ReadString(_lpData, _pos,33)
|
| | | self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.PlayerID = 0
|
| | | self.PlayerName = ""
|
| | | self.Job = 0
|
| | | self.LV = 0
|
| | | self.RealmLV = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += 4
|
| | | length += 33
|
| | | length += 1
|
| | | length += 2
|
| | | length += 2
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteDWORD(data, self.PlayerID)
|
| | | data = CommFunc.WriteString(data, 33, self.PlayerName)
|
| | | data = CommFunc.WriteBYTE(data, self.Job)
|
| | | data = CommFunc.WriteWORD(data, self.LV)
|
| | | data = CommFunc.WriteWORD(data, self.RealmLV)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | PlayerID:%d,
|
| | | PlayerName:%s,
|
| | | Job:%d,
|
| | | LV:%d,
|
| | | RealmLV:%d
|
| | | '''\
|
| | | %(
|
| | | self.PlayerID,
|
| | | self.PlayerName,
|
| | | self.Job,
|
| | | self.LV,
|
| | | self.RealmLV
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagGCSkyTowerPassFloor(Structure):
|
| | | FloorID = 0 #(DWORD FloorID)// 层ID
|
| | | PassPlayerCount = 0 #(BYTE PassPlayerCount)// 通关记录玩家数
|
| | | PassPlayerIDList = list() #(vector<DWORD> PassPlayerIDList)// 通关记录玩家ID列表 [第1个通过玩家ID, 第2个, ...]
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | self.FloorID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.PassPlayerCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.PassPlayerCount):
|
| | | value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
|
| | | self.PassPlayerIDList.append(value)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.FloorID = 0
|
| | | self.PassPlayerCount = 0
|
| | | self.PassPlayerIDList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += 4
|
| | | length += 1
|
| | | length += 4 * self.PassPlayerCount
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteDWORD(data, self.FloorID)
|
| | | data = CommFunc.WriteBYTE(data, self.PassPlayerCount)
|
| | | for i in range(self.PassPlayerCount):
|
| | | data = CommFunc.WriteDWORD(data, self.PassPlayerIDList[i])
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | FloorID:%d,
|
| | | PassPlayerCount:%d,
|
| | | PassPlayerIDList:%s
|
| | | '''\
|
| | | %(
|
| | | self.FloorID,
|
| | | self.PassPlayerCount,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagGCSkyTowerPassPlayerInfo(Structure):
|
| | | Head = tagHead()
|
| | | FloorCount = 0 #(WORD FloorCount)
|
| | | PassFloorList = list() #(vector<tagGCSkyTowerPassFloor> PassFloorList)// 通关塔层信息列表
|
| | | PlayerCount = 0 #(WORD PlayerCount)
|
| | | PassPlayerList = list() #(vector<tagGCSkyTowerPassPlayer> PassPlayerList)// 通关玩家信息列表
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA9
|
| | | self.Head.SubCmd = 0xAD
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.FloorCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | for i in range(self.FloorCount):
|
| | | temPassFloorList = tagGCSkyTowerPassFloor()
|
| | | _pos = temPassFloorList.ReadData(_lpData, _pos)
|
| | | self.PassFloorList.append(temPassFloorList)
|
| | | self.PlayerCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | for i in range(self.PlayerCount):
|
| | | temPassPlayerList = tagGCSkyTowerPassPlayer()
|
| | | _pos = temPassPlayerList.ReadData(_lpData, _pos)
|
| | | self.PassPlayerList.append(temPassPlayerList)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA9
|
| | | self.Head.SubCmd = 0xAD
|
| | | self.FloorCount = 0
|
| | | self.PassFloorList = list()
|
| | | self.PlayerCount = 0
|
| | | self.PassPlayerList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 2
|
| | | for i in range(self.FloorCount):
|
| | | length += self.PassFloorList[i].GetLength()
|
| | | length += 2
|
| | | for i in range(self.PlayerCount):
|
| | | length += self.PassPlayerList[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteWORD(data, self.FloorCount)
|
| | | for i in range(self.FloorCount):
|
| | | data = CommFunc.WriteString(data, self.PassFloorList[i].GetLength(), self.PassFloorList[i].GetBuffer())
|
| | | data = CommFunc.WriteWORD(data, self.PlayerCount)
|
| | | for i in range(self.PlayerCount):
|
| | | data = CommFunc.WriteString(data, self.PassPlayerList[i].GetLength(), self.PassPlayerList[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | FloorCount:%d,
|
| | | PassFloorList:%s,
|
| | | PlayerCount:%d,
|
| | | PassPlayerList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.FloorCount,
|
| | | "...",
|
| | | self.PlayerCount,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagGCSkyTowerPassPlayerInfo=tagGCSkyTowerPassPlayerInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCSkyTowerPassPlayerInfo.Head.Cmd,m_NAtagGCSkyTowerPassPlayerInfo.Head.SubCmd))] = m_NAtagGCSkyTowerPassPlayerInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A9 06 商城全服购买次数通知 #tagGCStoreServerBuyCntInfo
|
| | |
|
| | | class tagGCStoreServerBuyCnt(Structure):
|
| | |
| | | #------------------------------------------------------
|
| | | # B2 13 天星塔通关层数 #tagMCSkyTowerInfo
|
| | |
|
| | | class tagMCSkyTowerInfo(Structure):
|
| | | class tagMCSkyTowerServerReward(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("Floor", c_int), # 已通关层
|
| | | ("ServerRewardRecord", c_int), #全服挑战层领奖记录,按奖励记录二进制位存储是否已领取
|
| | | ("Floor", c_int), # 全服奖励层ID
|
| | | ("ServerRewardRecord", c_int), #该层全服领奖记录,按所需人数作为二进制位进行位运算判断是否已领取
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB2
|
| | | self.SubCmd = 0x13
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | |
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.Cmd = 0xB2
|
| | | self.SubCmd = 0x13
|
| | | self.Floor = 0
|
| | | self.ServerRewardRecord = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCSkyTowerInfo)
|
| | | return sizeof(tagMCSkyTowerServerReward)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B2 13 天星塔通关层数 //tagMCSkyTowerInfo:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | Floor:%d,
|
| | | ServerRewardRecord:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.Floor,
|
| | | self.ServerRewardRecord
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagMCSkyTowerInfo(Structure):
|
| | | Head = tagHead()
|
| | | Floor = 0 #(DWORD Floor)// 已通关层
|
| | | ServerRewardCount = 0 #(WORD ServerRewardCount)
|
| | | ServerRewardList = list() #(vector<tagMCSkyTowerServerReward> ServerRewardList)// 全服奖励领取记录列表,下发的层记录替换更新即可,领奖记录没有变化时服务端不会下发
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xB2
|
| | | self.Head.SubCmd = 0x13
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.Floor,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.ServerRewardCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | for i in range(self.ServerRewardCount):
|
| | | temServerRewardList = tagMCSkyTowerServerReward()
|
| | | _pos = temServerRewardList.ReadData(_lpData, _pos)
|
| | | self.ServerRewardList.append(temServerRewardList)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xB2
|
| | | self.Head.SubCmd = 0x13
|
| | | self.Floor = 0
|
| | | self.ServerRewardCount = 0
|
| | | self.ServerRewardList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 2
|
| | | for i in range(self.ServerRewardCount):
|
| | | length += self.ServerRewardList[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.Floor)
|
| | | data = CommFunc.WriteWORD(data, self.ServerRewardCount)
|
| | | for i in range(self.ServerRewardCount):
|
| | | data = CommFunc.WriteString(data, self.ServerRewardList[i].GetLength(), self.ServerRewardList[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | Floor:%d,
|
| | | ServerRewardCount:%d,
|
| | | ServerRewardList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.Floor,
|
| | | self.ServerRewardCount,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCSkyTowerInfo=tagMCSkyTowerInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSkyTowerInfo.Cmd,m_NAtagMCSkyTowerInfo.SubCmd))] = m_NAtagMCSkyTowerInfo
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSkyTowerInfo.Head.Cmd,m_NAtagMCSkyTowerInfo.Head.SubCmd))] = m_NAtagMCSkyTowerInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import GameLogic_SkyTower
|
| | | import IpyGameDataPY
|
| | | import GameWorld
|
| | | import ChConfig
|
| | | import PlayerControl
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | #全局变量
|
| | | #---------------------------------------------------------------------
|
| | |
| | | # @param cmdList 参数列表
|
| | | # @return None
|
| | | def OnExec(curPlayer, cmdList):
|
| | | if len(cmdList) != 1:
|
| | | GameWorld.DebugAnswer(curPlayer, "SetSkyTower 层")
|
| | | if not cmdList:
|
| | | GameWorld.DebugAnswer(curPlayer, "设置过关塔层: SetSkyTower 1 层")
|
| | | GameWorld.DebugAnswer(curPlayer, "填充全服过关: SetSkyTower 2 层 过关机器人数")
|
| | | GameWorld.DebugAnswer(curPlayer, "重置全服奖励: SetSkyTower 3")
|
| | | GameWorld.DebugAnswer(curPlayer, "重置全服过关: SetSkyTower 4")
|
| | | GameWorld.DebugAnswer(curPlayer, "注: 重置全服过关需重登")
|
| | | return
|
| | | fbLevel = cmdList[0]
|
| | | GameLogic_SkyTower.SetSkyTowerCurfloorID(curPlayer, fbLevel)
|
| | | isSendGameServer = False
|
| | | |
| | | cmdType = cmdList[0]
|
| | | if cmdType == 1:
|
| | | fbLevel = cmdList[1] if len(cmdList) > 1 else 0
|
| | | GameLogic_SkyTower.SetSkyTowerCurfloorID(curPlayer, fbLevel)
|
| | | GameLogic_SkyTower.SyncSkyTowerInfo(curPlayer)
|
| | | GameWorld.DebugAnswer(curPlayer, "天星塔过关数设置 floor=%s!"%fbLevel)
|
| | | elif cmdType == 2:
|
| | | floorID = cmdList[1] if len(cmdList) > 1 else 0
|
| | | #robotCount = cmdList[2] if len(cmdList) > 2 else 1
|
| | | isSendGameServer = True
|
| | | ipyDataServer = IpyGameDataPY.GetIpyGameDataNotLog("SkyTowerServerChallenge", floorID)
|
| | | if not ipyDataServer:
|
| | | GameWorld.DebugAnswer(curPlayer, "不存在该全服奖励层:%s" % floorID)
|
| | | return
|
| | | elif cmdType == 3:
|
| | | __ClearServerPassFloorReward(curPlayer)
|
| | | |
| | | elif cmdType == 4:
|
| | | isSendGameServer = True
|
| | | __ClearServerPassFloorReward(curPlayer)
|
| | | |
| | | return isSendGameServer
|
| | |
|
| | | GameLogic_SkyTower.SyncSkyTowerInfo(curPlayer)
|
| | | GameWorld.DebugAnswer(curPlayer, "天星塔过关数设置 floor=%s!"%fbLevel)
|
| | | def __ClearServerPassFloorReward(curPlayer):
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in range(ipyDataMgr.GetSkyTowerServerChallengeCount()):
|
| | | ipyDataServer = ipyDataMgr.GetSkyTowerServerChallengeByIndex(index)
|
| | | floorID = ipyDataServer.GetFloorID()
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID, 0)
|
| | | GameLogic_SkyTower.SyncSkyTowerInfo(curPlayer, None, True)
|
| | | return
|
| | |
|
| | |
| | | import GameObj
|
| | | import GameWorldProcess
|
| | |
|
| | |
|
| | | g_runeTypeDict = {}
|
| | | FBDict_Level = 'FBDict_Level' # 副本关卡
|
| | |
|
| | |
|
| | | # 副本通用配置
|
| | | (
|
| | |
| | | Def_DayPrizeMaxCnt, #每日奖励最多累积几天(配0则无限)
|
| | | ) = range(4)
|
| | |
|
| | |
|
| | |
|
| | |
|
| | | # 副本状态
|
| | | (
|
| | | FB_State_Open, # 副本开启
|
| | |
| | | FB_State_FreeTime, # 活动结束准备(胜利/失败)
|
| | | FB_State_Close, # 关闭副本
|
| | | ) = range(5)
|
| | |
|
| | |
|
| | | ## 天星塔配置
|
| | | def __GetTrialCfg(): return FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_SkyTower)
|
| | |
| | | SyncSkyTowerInfo(curPlayer)
|
| | | return
|
| | |
|
| | | def OnMixFirstLogin(curPlayer):
|
| | | curFloorID = __GetSkyTowerCurFloor(curPlayer)
|
| | | if not curFloorID:
|
| | | return
|
| | | |
| | | passFloorInfo = {}
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in range(ipyDataMgr.GetSkyTowerServerChallengeCount()):
|
| | | ipyDataServer = ipyDataMgr.GetSkyTowerServerChallengeByIndex(index)
|
| | | floorID = ipyDataServer.GetFloorID()
|
| | | if floorID > curFloorID:
|
| | | continue
|
| | | maxNeedPassCount = 0
|
| | | for rank in ipyDataServer.GetPassRankRewardInfo().keys():
|
| | | maxNeedPassCount = max(maxNeedPassCount, int(rank))
|
| | | for needPlayerCount in ipyDataServer.GetServerRewardInfo().keys():
|
| | | maxNeedPassCount = max(maxNeedPassCount, int(needPlayerCount))
|
| | | |
| | | passFloorInfo[floorID] = maxNeedPassCount
|
| | | |
| | | playerID = curPlayer.GetPlayerID()
|
| | | msgInfo = str(["MixFirstLogin", [passFloorInfo]])
|
| | | GameWorld.Log("天星塔合服首登同步GameServer: %s" % msgInfo, playerID)
|
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))
|
| | | return
|
| | |
|
| | | ## 同步天星塔关卡信息
|
| | | # @floorID 为0时默认全部同步,> 0时仅同步该关卡
|
| | | def SyncSkyTowerInfo(curPlayer):
|
| | | def SyncSkyTowerInfo(curPlayer, serverRewardFloor=None, force=False):
|
| | | |
| | | syncFloorIDList = []
|
| | | if serverRewardFloor == None:
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in range(ipyDataMgr.GetSkyTowerServerChallengeCount()):
|
| | | ipyDataServer = ipyDataMgr.GetSkyTowerServerChallengeByIndex(index)
|
| | | syncFloorIDList.append(ipyDataServer.GetFloorID())
|
| | | elif serverRewardFloor > 0:
|
| | | syncFloorIDList = [serverRewardFloor]
|
| | | |
| | | serverRewardList = [] |
| | | for floorID in syncFloorIDList:
|
| | | recordValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID)
|
| | | if not recordValue and not force:
|
| | | continue
|
| | | serverRewardInfo = ChPyNetSendPack.tagMCSkyTowerServerReward()
|
| | | serverRewardInfo.Floor = floorID
|
| | | serverRewardInfo.ServerRewardRecord = recordValue
|
| | | serverRewardList.append(serverRewardInfo)
|
| | | |
| | | ttInfo = ChPyNetSendPack.tagMCSkyTowerInfo()
|
| | | ttInfo.Clear()
|
| | | ttInfo.Floor = __GetSkyTowerCurFloor(curPlayer)
|
| | | ttInfo.ServerRewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerChallengeRewardRecord)
|
| | | ttInfo.ServerRewardList = serverRewardList
|
| | | ttInfo.ServerRewardCount = len(ttInfo.ServerRewardList)
|
| | | NetPackCommon.SendFakePack(curPlayer, ttInfo)
|
| | | return
|
| | |
|
| | |
| | | __SendSkyTowerOverInfo(curPlayer, floorID, True, prizeDict)
|
| | | PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_SkyTower)
|
| | |
|
| | | SyncSkyTowerInfo(curPlayer) # 同步最新关卡信息
|
| | | SyncSkyTowerInfo(curPlayer, 0) # 同步最新关卡信息
|
| | | __SetFBToFreeTime(tick)
|
| | |
|
| | | if floorID >= 10:
|
| | |
| | | # 全服目标
|
| | | ipyDataServer = IpyGameDataPY.GetIpyGameDataNotLog("SkyTowerServerChallenge", floorID)
|
| | | if ipyDataServer:
|
| | | maxNeedPassCount = 0
|
| | | rankRewardInfo = ipyDataServer.GetPassRankRewardInfo()
|
| | | for rank in rankRewardInfo.keys():
|
| | | maxNeedPassCount = max(maxNeedPassCount, int(rank))
|
| | | for needPlayerCount in ipyDataServer.GetServerRewardInfo().keys():
|
| | | maxNeedPassCount = max(maxNeedPassCount, int(needPlayerCount))
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | playerName = curPlayer.GetPlayerName()
|
| | | job = curPlayer.GetJob()
|
| | | playerLV = curPlayer.GetLV()
|
| | | realmLV = curPlayer.GetOfficialRank()
|
| | | msgInfo = str(["ServerChallengePass", [floorID, playerID, playerName, job, playerLV, realmLV]])
|
| | | msgInfo = str(["ServerChallengePass", [floorID, maxNeedPassCount, rankRewardInfo]])
|
| | | GameWorld.DebugLog("全服过关信息同步GameServer: %s" % msgInfo, playerID)
|
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))
|
| | |
|
| | | return
|
| | |
| | | StartfloorID(curPlayer, floorID, tick)
|
| | | return
|
| | |
|
| | | def OnGetSkyTowerServerChallengeReward(curPlayer, floorID):
|
| | | def OnGetSkyTowerServerChallengeReward(curPlayer, floorID, needPlayerCount):
|
| | | ## 领取全服挑战层奖励
|
| | | needPlayerCount = GameWorld.ToIntDef(needPlayerCount, 1)
|
| | | if needPlayerCount <= 0:
|
| | | # 必须大于0, 0记录排名奖励是否已领取
|
| | | return
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("SkyTowerServerChallenge", floorID)
|
| | | if not ipyData:
|
| | | return
|
| | | recordIndex = ipyData.GetRewardRecordIndex()
|
| | | rewardInfo = ipyData.GetReward()
|
| | | rewardInfo = ipyData.GetServerRewardInfo()
|
| | | if str(needPlayerCount) not in rewardInfo:
|
| | | GameWorld.DebugLog("不存在该全服奖励:floorID=%s,needPlayerCount=%s" % (floorID, needPlayerCount), playerID)
|
| | | return
|
| | | giveItemList = rewardInfo[str(needPlayerCount)]
|
| | |
|
| | | rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerChallengeRewardRecord)
|
| | | if rewardRecord & pow(2, recordIndex):
|
| | | GameWorld.DebugLog("天星塔全服挑战层已领奖!floorID=%s,recordIndex=%s,rewardRecord=%s" % (floorID, recordIndex, rewardRecord))
|
| | | rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID)
|
| | | if rewardRecord & pow(2, needPlayerCount):
|
| | | GameWorld.DebugLog("天星塔全服挑战层已领奖!floorID=%s,needPlayerCount=%s,rewardRecord=%s" % (floorID, needPlayerCount, rewardRecord), playerID)
|
| | | return
|
| | |
|
| | | ipyData.GetRewardRecordIndex()
|
| | | msgInfo = str(["ServerChallengeReward", [floorID, recordIndex, rewardInfo]])
|
| | | msgInfo = str(["ServerChallengeReward", [floorID, needPlayerCount, giveItemList]])
|
| | | GameWorld.DebugLog("天星塔全服挑战层领奖同步GameServer: %s" % msgInfo, playerID)
|
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))
|
| | | return
|
| | |
|
| | | def GameServer_SkyTowerInfo(curPlayer, resultList):
|
| | | ## GameServer 返回信息
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | msgType, msgData = resultList[:2]
|
| | |
|
| | | if msgType == "ServerChallengeReward":
|
| | | isPass = resultList[2]
|
| | | floorID, recordIndex, rewardInfo = msgData
|
| | | if not isPass:
|
| | | GameWorld.Log("天星塔GameServer返回: %s" % str(resultList), playerID)
|
| | | if msgType == "ServerChallengePass":
|
| | | floorID, _, rankRewardInfo = msgData
|
| | | rankIndex = resultList[2]
|
| | | if rankIndex < 0:
|
| | | GameWorld.DebugLog("过关全服排名未上榜: floorID=%s,rankIndex=%s" % (floorID, rankIndex), playerID)
|
| | | return
|
| | | |
| | | rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerChallengeRewardRecord)
|
| | | rank = rankIndex + 1
|
| | | orderDict = {}
|
| | | for k, v in rankRewardInfo.items():
|
| | | orderDict[int(k)] = v
|
| | | giveItemList = GameWorld.GetOrderValueByDict(orderDict, rank, False)
|
| | | if not giveItemList:
|
| | | GameWorld.DebugLog("该层该名次没有奖励: rank=%s" % rank, playerID)
|
| | | return
|
| | | recordIndex = 0 # 排名奖励默认用0索引位记录
|
| | | rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID)
|
| | | if rewardRecord & pow(2, recordIndex):
|
| | | GameWorld.DebugLog("返回时天星塔全服挑战层已领奖!floorID=%s,recordIndex=%s,rewardRecord=%s" % (floorID, recordIndex, rewardRecord))
|
| | | GameWorld.Log("过关排名奖励已发放过!floorID=%s,recordIndex=%s,rewardRecord=%s" % (floorID, recordIndex, rewardRecord), playerID)
|
| | | return
|
| | | updRewardRecord = rewardRecord | pow(2, recordIndex)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerChallengeRewardRecord, updRewardRecord)
|
| | | SyncSkyTowerInfo(curPlayer)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID, updRewardRecord)
|
| | | GameWorld.Log("天星塔发放过关全服排名奖励: floorID=%s,rank=%s,updRewardRecord=%s,giveItemList=%s" |
| | | % (floorID, rank, updRewardRecord, giveItemList), playerID)
|
| | |
|
| | | giveItemList = [[itemID, itemCnt, 0] for itemID, itemCnt in rewardInfo.items()]
|
| | | paramList = [floorID, rank]
|
| | | PlayerControl.SendMailByKey("SkyTowerPassRank", [playerID], giveItemList, paramList)
|
| | | |
| | | elif msgType == "ServerChallengeReward":
|
| | | floorID, needPlayerCount, giveItemList = msgData
|
| | | canGet = resultList[2]
|
| | | if not canGet:
|
| | | GameWorld.DebugLog("返回时天星塔全服挑战层不能领取: floorID=%s,needPlayerCount=%s" % (floorID, needPlayerCount), playerID)
|
| | | return
|
| | | |
| | | rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID)
|
| | | if rewardRecord & pow(2, needPlayerCount):
|
| | | GameWorld.DebugLog("返回时天星塔全服挑战层已领奖!floorID=%s,needPlayerCount=%s,rewardRecord=%s" % (floorID, needPlayerCount, rewardRecord), playerID)
|
| | | return
|
| | | updRewardRecord = rewardRecord | pow(2, needPlayerCount)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerServerRecord % floorID, updRewardRecord)
|
| | | |
| | | GameWorld.Log("天星塔发放过关全服奖励: floorID=%s,needPlayerCount=%s,updRewardRecord=%s,giveItemList=%s" |
| | | % (floorID, needPlayerCount, updRewardRecord, giveItemList), playerID)
|
| | | |
| | | event = ["SKYTowerServerChallengeReward", False, {"floorID":floorID}]
|
| | | ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, None, event)
|
| | | |
| | | SyncSkyTowerInfo(curPlayer, floorID)
|
| | |
|
| | | return
|
| | |
|
| | |
| | |
|
| | | "SkyTowerServerChallenge":(
|
| | | ("DWORD", "FloorID", 1),
|
| | | ("BYTE", "RewardRecordIndex", 0),
|
| | | ("dict", "Reward", 0),
|
| | | ("dict", "PassRankRewardInfo", 0),
|
| | | ("dict", "ServerRewardInfo", 0),
|
| | | ),
|
| | |
|
| | | "LingGenEffect":(
|
| | |
| | | |
| | | def __init__(self): |
| | | self.FloorID = 0
|
| | | self.RewardRecordIndex = 0
|
| | | self.Reward = {} |
| | | self.PassRankRewardInfo = {}
|
| | | self.ServerRewardInfo = {} |
| | | return |
| | | |
| | | def GetFloorID(self): return self.FloorID # 层
|
| | | def GetRewardRecordIndex(self): return self.RewardRecordIndex # 奖励记录位索引
|
| | | def GetReward(self): return self.Reward # 奖励 |
| | | def GetPassRankRewardInfo(self): return self.PassRankRewardInfo # 通关排名奖励 {"名次":[[物品ID,个数,是否拍品],...], ...}
|
| | | def GetServerRewardInfo(self): return self.ServerRewardInfo # 通关排名奖励 {"所需过关人数":[[物品ID,个数,是否拍品],...], ...} |
| | | |
| | | # 灵根特效表 |
| | | class IPY_LingGenEffect(): |
| | |
| | | # 同步排行榜
|
| | | PlayerBillboard.UpdatePlayerBillboardOnLeaveServer(curPlayer, isAll=True)
|
| | |
|
| | | # 天星塔全服过关记录
|
| | | GameLogic_SkyTower.OnMixFirstLogin(curPlayer)
|
| | | |
| | | # 重置玩家改名次数
|
| | | #UpdatePlayerName.ResetChangeNameCnt(curPlayer)
|
| | | return
|
| | |
| | | PlayerCoin.OnGetOnlineRechargeTH(curPlayer)
|
| | | #天星塔全服挑战层领奖
|
| | | elif rewardType == ChConfig.Def_RewardType_SkyTowerServerChallengeReward:
|
| | | GameLogic_SkyTower.OnGetSkyTowerServerChallengeReward(curPlayer, dataEx)
|
| | | GameLogic_SkyTower.OnGetSkyTowerServerChallengeReward(curPlayer, dataEx, dataExStr)
|
| | | #创角奖励
|
| | | elif rewardType == ChConfig.Def_RewardType_CreateRole:
|
| | | OnGetCreateRoleAward(curPlayer)
|