From ee017bc9f5435bf6de2e28aab2cb5d3edc430d95 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 25 十月 2023 01:33:14 +0800 Subject: [PATCH] 9964 【BT0.1】【主干】境界塔 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 52 +++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/RealmTower.py | 43 ++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_RealmTower.py | 310 ++++++++++++++++++++++++++++++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 26 ++ PySysDB/PySysDBPY.h | 10 + ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 52 +++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 6 7 files changed, 499 insertions(+), 0 deletions(-) diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index b7c5b6b..e45a005 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -90,6 +90,16 @@ BYTE AddFreePoint; //增加自由属性点 }; +//境界塔表 + +struct tagRealmTower +{ + DWORD _FloorID; //层 + WORD NeedRealmLV; //所需境界 + DWORD BossID; //BossID + list RewardItemList; //奖励物品列表 +}; + //境界炼体属性表 struct tagLianTi diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index d792422..2aaabb1 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py @@ -44522,6 +44522,58 @@ #------------------------------------------------------ +# B2 17 境界塔信息 #tagMCRealmTowerInfo + +class tagMCRealmTowerInfo(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("Floor", c_int), # 已通关层 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB2 + self.SubCmd = 0x17 + return + + def ReadData(self, stringData, _pos=0, _len=0): + self.Clear() + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() + + def Clear(self): + self.Cmd = 0xB2 + self.SubCmd = 0x17 + self.Floor = 0 + return + + def GetLength(self): + return sizeof(tagMCRealmTowerInfo) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B2 17 境界塔信息 //tagMCRealmTowerInfo: + Cmd:%s, + SubCmd:%s, + Floor:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.Floor + ) + return DumpString + + +m_NAtagMCRealmTowerInfo=tagMCRealmTowerInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCRealmTowerInfo.Cmd,m_NAtagMCRealmTowerInfo.SubCmd))] = m_NAtagMCRealmTowerInfo + + +#------------------------------------------------------ # B2 13 天星塔通关层数 #tagMCSkyTowerInfo class tagMCSkyTowerServerReward(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py index 4a53f5a..41341d2 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py @@ -1820,6 +1820,8 @@ Def_FBMapID_ZhuXianBoss = 31380 #天星塔/丹塔 Def_FBMapID_SkyTower = 31370 +#境界塔 +Def_FBMapID_RealmTower = 31310 #仙魔之争 Def_FBMapID_XMZZ = 31010 #神兽副本 @@ -1979,6 +1981,7 @@ 'GatherSoul':[Def_FBMapID_GatherSoul],#聚魂副本 'ZhuXianBoss':[Def_FBMapID_ZhuXianBoss],#诛仙BOSS 'SkyTower':[Def_FBMapID_SkyTower],#天星塔 + 'RealmTower':[Def_FBMapID_RealmTower],#境界塔 'AllFamilyBoss':[Def_FBMapID_AllFamilyBoss],#多仙盟BOSS 'HorsePetBoss':[Def_FBMapID_HorsePetBoss],#骑宠BOSS 'FairyTreasure':[Def_FBMapID_FairyTreasure],#缥缈宝藏 @@ -3772,6 +3775,9 @@ Def_Player_Dict_SkyTowerFloor = "SkyTowerFloor" # 天星塔已通关层数 Def_Player_Dict_SkyTowerServerRecord = "SkyTowerServerRecord_%s" # 天星塔全服挑战层领奖记录,参数(层) +#境界塔 +Def_Player_Dict_RealmTowerFloor = "RealmTowerFloor" # 已通关层数 + #古神禁地 Def_Player_Dict_GodArea_Anger = "GodArea_Anger" # 古神禁地怒气值 Def_Player_Dict_GodArea_LastAddAngerTime = "GodArea_LastAddAngerTime" # 古神禁地上一次增加怒气值的时间 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index d792422..2aaabb1 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -44522,6 +44522,58 @@ #------------------------------------------------------ +# B2 17 境界塔信息 #tagMCRealmTowerInfo + +class tagMCRealmTowerInfo(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("Floor", c_int), # 已通关层 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB2 + self.SubCmd = 0x17 + return + + def ReadData(self, stringData, _pos=0, _len=0): + self.Clear() + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() + + def Clear(self): + self.Cmd = 0xB2 + self.SubCmd = 0x17 + self.Floor = 0 + return + + def GetLength(self): + return sizeof(tagMCRealmTowerInfo) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B2 17 境界塔信息 //tagMCRealmTowerInfo: + Cmd:%s, + SubCmd:%s, + Floor:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.Floor + ) + return DumpString + + +m_NAtagMCRealmTowerInfo=tagMCRealmTowerInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCRealmTowerInfo.Cmd,m_NAtagMCRealmTowerInfo.SubCmd))] = m_NAtagMCRealmTowerInfo + + +#------------------------------------------------------ # B2 13 天星塔通关层数 #tagMCSkyTowerInfo class tagMCSkyTowerServerReward(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/RealmTower.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/RealmTower.py new file mode 100644 index 0000000..24eb694 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/RealmTower.py @@ -0,0 +1,43 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package GM.Commands.RealmTower +# +# @todo:境界塔 +# @author hxp +# @date 2023-10-25 +# @version 1.0 +# +# 详细描述: 境界塔 +# +#------------------------------------------------------------------------------- +#"""Version = 2023-10-25 01:30""" +#------------------------------------------------------------------------------- + +import GameWorld +import PlayerControl +import GameLogic_RealmTower +import ChConfig + +## 逻辑实现 +## GM命令执行入口 +# @param curPlayer +# @param cmdList 参数列表 +# @return None +def OnExec(curPlayer, cmdList): + if not cmdList: + GameWorld.DebugAnswer(curPlayer, "设置境界塔层: RealmTower 层") + return + + floorID = cmdList[0] + if not GameLogic_RealmTower.GetTowerIpyData(floorID): + GameWorld.DebugAnswer(curPlayer, "不存在该层") + return + + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RealmTowerFloor, floorID) + + GameLogic_RealmTower.SyncRealmTowerInfo(curPlayer) + GameWorld.DebugAnswer(curPlayer, "境界塔层设置 floorID=%s" % floorID) + return + diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_RealmTower.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_RealmTower.py new file mode 100644 index 0000000..25a083f --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_RealmTower.py @@ -0,0 +1,310 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package GameWorldLogic.FBProcess.GameLogic_RealmTower +# +# @todo:境界塔 +# @author hxp +# @date 2023-10-25 +# @version 1.0 +# +# 详细描述: 境界塔 +# +#------------------------------------------------------------------------------- +#"""Version = 2023-10-25 01:30""" +#------------------------------------------------------------------------------- + +import FBCommon +import GameWorld +import IPY_GameWorld +import PlayerControl +import NetPackCommon +import NPCCustomRefresh +import GameWorldProcess +import ChPyNetSendPack +import ItemControler +import IpyGameDataPY +import ChConfig +import ChPlayer +import GameObj + +FBDict_Floor = 'FBDict_Floor' # 副本关卡 + +# 副本通用配置 +( +Def_PrepareTime, # 每关准备时间,秒 +Def_FightTime, # 每关战斗时间,秒 +Def_ExitTime, # 退出时间, 秒 +) = range(3) + +# 副本状态 +( +FB_State_Open, # 副本开启 +FB_State_FightPrepare, # 战斗准备时间 +FB_State_Fighting, # 战斗 +FB_State_FreeTime, # 活动结束准备(胜利/失败) +FB_State_Close, # 关闭副本 +) = range(5) + +def __GetFBTimelCfg(): return FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_RealmTower) + +def GetTowerIpyData(floor): return IpyGameDataPY.GetIpyGameData("RealmTower", floor) + +def OnFBPlayerOnLogin(curPlayer): + SyncRealmTowerInfo(curPlayer) + return + +def SyncRealmTowerInfo(curPlayer): + clientPack = ChPyNetSendPack.tagMCRealmTowerInfo() + clientPack.Clear() + clientPack.Floor = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealmTowerFloor) + NetPackCommon.SendFakePack(curPlayer, clientPack) + return + +def OnEnterFBEvent(curPlayer, mapID, lineId, tick): + nextFloorID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealmTowerFloor) + 1 + return __CheckCanChallenge(curPlayer, nextFloorID) + +## 检查可否进行挑战 +def __CheckCanChallenge(curPlayer, floorID): + playerID = curPlayer.GetPlayerID() + ipyData = GetTowerIpyData(floorID) + if not ipyData: + GameWorld.ErrLog("境界塔层不存在: floorID=%s" % floorID, playerID) + return False + + curFloorID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealmTowerFloor) + if floorID <= curFloorID: + GameWorld.DebugLog("该境界塔层已过关: floorID=%s" % floorID, playerID) + return False + + if floorID > curFloorID + 1: + GameWorld.DebugLog("上一层未过关: floorID=%s > curFloorID=%s+1" % (floorID, curFloorID), playerID) + return False + + if curPlayer.GetOfficialRank() < ipyData.GetNeedRealmLV(): + GameWorld.DebugLog("该境界塔层所需境界不足: floorID=%s,NeedRealmLV=%s" % (floorID, ipyData.GetNeedRealmLV()), playerID) + return False + + return True + +def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick): + return ipyEnterPosInfo + +def OnChangeMapAsk(ask, tick): + return IPY_GameWorld.cmeAccept + +def DoEnterFB(curPlayer, tick): + gameFB = GameWorld.GetGameFB() + fbStep = gameFB.GetFBStep() + + if fbStep == FB_State_FightPrepare: + notify_tick = __GetFBTimelCfg()[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) + curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True) + + elif fbStep == FB_State_Fighting: + notify_tick = __GetFBTimelCfg()[Def_FightTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) + curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True) + + elif fbStep > FB_State_Fighting: + PlayerControl.PlayerLeaveFB(curPlayer) + return + + # 不做处理,有副本行为客户端发包选择挑战关卡 + return + +def OnCloseFB(tick): + return + +def DoExitFB(curPlayer, tick): + # 玩家退出默认关闭副本 + GameWorldProcess.CloseFB(tick) + return + +def OnProcess(tick): + gameFB = GameWorld.GetGameFB() + fbStep = gameFB.GetFBStep() + + if fbStep == FB_State_FightPrepare: + __DoLogic_FightPrepare(tick) + elif fbStep == FB_State_Fighting: + __DoLogic_Fighting(tick) + elif fbStep == FB_State_FreeTime: + __DoLogic_FreeTime(tick) + elif fbStep == FB_State_Close: + pass + + return + +## 获取BossID +def __GetRealmTowerBossID(): + gameFB = GameWorld.GetGameFB() + floorID = gameFB.GetGameFBDictByKey(FBDict_Floor) + ipyData = GetTowerIpyData(floorID) + if not ipyData: + GameWorld.ErrLog("__GetRealmTowerBossID() can not find %s in RealmTowerNPC.txt" % floorID) + return 0 + return ipyData.GetBossID() + +##战斗准备时间 +# @param tick 时钟 +# @return 无意义 +def __DoLogic_FightPrepare(tick): + gameFB = GameWorld.GetGameFB() + + trialCfg = __GetFBTimelCfg() + if tick - gameFB.GetFBStepTick() < trialCfg[Def_PrepareTime] * 1000: + return + + bossID = __GetRealmTowerBossID() + if not bossID: + FBCommon.DoLogic_FBKickAllPlayer() + return + + FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, trialCfg[Def_FightTime] * 1000) + + NPCCustomRefresh.SetNPCRefresh(FBCommon.GetFBLineRefreshNPC(ChConfig.Def_FBMapID_RealmTower, 0), [bossID]) + + #转入战斗 + FBCommon.SetFBStep(FB_State_Fighting, tick) + return + +## 开始副本关卡 +def StartfloorID(curPlayer, floorID, tick): + if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie: + GameWorld.DebugLog("复活玩家...", curPlayer.GetPlayerID()) + ChPlayer.PlayerRebornByType(curPlayer, ChConfig.rebornType_City, tick) + GameObj.SetHPFull(curPlayer) + FBCommon.ClearFBNPC() + + gameFB = GameWorld.GetGameFB() + gameFB.SetGameFBDict(FBDict_Floor, floorID) + + prepareTick = __GetFBTimelCfg()[Def_PrepareTime] * 1000 + + FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, prepareTick) + FBCommon.SetFBStep(FB_State_FightPrepare, tick) + helpDict = {FBCommon.Help_wheel:floorID} + FBCommon.Notify_FBHelp(curPlayer, helpDict) + GameWorld.DebugLog("StartfloorID, floorID=%s, helpDict=%s" % (floorID, str(helpDict)), curPlayer.GetPlayerID()) + return + +def __DoLogic_Fighting(tick): + gameFB = GameWorld.GetGameFB() + + #判断时间结束 + if tick - gameFB.GetFBStepTick() < __GetFBTimelCfg()[Def_FightTime] * 1000: + return + + floorID = gameFB.GetGameFBDictByKey(FBDict_Floor) + playerManager = GameWorld.GetMapCopyPlayerManager() + for index in xrange(playerManager.GetPlayerCount()): + curPlayer = playerManager.GetPlayerByIndex(index) + if not curPlayer: + continue + __SendRealmTowerOverInfo(curPlayer, floorID, False) + + #游戏结束 + __SetFBToFreeTime(tick) + return + +def __SetFBToFreeTime(tick): + FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttLeaveMap, __GetFBTimelCfg()[Def_ExitTime] * 1000) + FBCommon.SetFBStep(FB_State_FreeTime, tick) + return + +def __DoLogic_FreeTime(tick): + if tick - GameWorld.GetGameFB().GetFBStepTick() < __GetFBTimelCfg()[Def_ExitTime] * 1000: + return + + return + +def DoFB_Player_KillNPC(curPlayer, curNPC, tick): + gameFB = GameWorld.GetGameFB() + if gameFB.GetFBStep() != FB_State_Fighting: + return + + bossID = __GetRealmTowerBossID() + if bossID != curNPC.GetNPCID(): + return + + floorID = gameFB.GetGameFBDictByKey(FBDict_Floor) + + # 过关全服广播 + ipyData = GetTowerIpyData(floorID) + if not ipyData: + return + + #更新关卡 + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RealmTowerFloor, floorID) + GameWorld.DebugLog('更新境界塔已通关数 %s' % floorID) + + # 给过关奖励 + giveItemList = ipyData.GetRewardItemList() + ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, None, ["RealmTower", False, {}]) + prizeDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)} + + # 过关时间 + costTime = tick - GameWorld.GetGameFB().GetFBStepTick() + prizeDict[FBCommon.Over_costTime] = costTime + __SendRealmTowerOverInfo(curPlayer, floorID, True, prizeDict) + + SyncRealmTowerInfo(curPlayer) + + __SetFBToFreeTime(tick) + return + +## 发送挑战结果信息 +def __SendRealmTowerOverInfo(curPlayer, floorID, isPass, overDict={}): + overDict[FBCommon.Over_dataMapID] = ChConfig.Def_FBMapID_RealmTower + overDict[FBCommon.Over_wheel] = floorID + overDict[FBCommon.Over_isPass] = int(isPass) + GameWorld.DebugLog("__SendRealmTowerOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID()) + FBCommon.Notify_FB_Over(curPlayer, overDict) + return + +## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定 +# @param attacker 攻击方 +# @param defender 防守方 +# @return bool +def CheckCanAttackTagObjInFB(attacker, defender): + gameFB = GameWorld.GetGameFB() + if gameFB.GetFBStep() != FB_State_Fighting: + return False + return True + +##玩家死亡 +def DoPlayerDead(curPlayer): + gameFB = GameWorld.GetGameFB() + floorID = gameFB.GetGameFBDictByKey(FBDict_Floor) + __SendRealmTowerOverInfo(curPlayer, floorID, False) + tick = GameWorld.GetGameWorld().GetTick() + #游戏结束 + __SetFBToFreeTime(tick) + return + +## 是否副本复活 +def OnPlayerReborn(): + return True + +## 副本行为 +def DoFBAction(curPlayer, actionType, actionInfo, tick): + # 默认为选择关卡,由客户端决定,进场及副本选关通用此行为 + if actionInfo <= 0: + return + + gameFB = GameWorld.GetGameFB() + fbStep = gameFB.GetFBStep() + + if fbStep in [FB_State_FightPrepare, FB_State_Fighting]: + GameWorld.DebugLog("准备或战斗中, 无法变更关卡!") + return + + floorID = actionInfo + if not __CheckCanChallenge(curPlayer, floorID): + FBCommon.DoLogic_FBKickAllPlayer() + return + + StartfloorID(curPlayer, floorID, tick) + return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index e4ff915..b721f29 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py @@ -103,6 +103,13 @@ ("BYTE", "AddFreePoint", 0), ), + "RealmTower":( + ("DWORD", "FloorID", 1), + ("WORD", "NeedRealmLV", 0), + ("DWORD", "BossID", 0), + ("list", "RewardItemList", 0), + ), + "LianTi":( ("BYTE", "LianTiLV", 1), ("list", "FixedAttrType", 0), @@ -2326,6 +2333,21 @@ def GetExpLimit(self): return self.ExpLimit # 修为池经验上限 def GetLearnSkillIDInfo(self): return self.LearnSkillIDInfo # 学习技能ID信息 {"职业":[技能ID, ...], ...} def GetAddFreePoint(self): return self.AddFreePoint # 增加自由属性点 + +# 境界塔表 +class IPY_RealmTower(): + + def __init__(self): + self.FloorID = 0 + self.NeedRealmLV = 0 + self.BossID = 0 + self.RewardItemList = [] + return + + def GetFloorID(self): return self.FloorID # 层 + def GetNeedRealmLV(self): return self.NeedRealmLV # 所需境界 + def GetBossID(self): return self.BossID # BossID + def GetRewardItemList(self): return self.RewardItemList # 奖励物品列表 # 境界炼体属性表 class IPY_LianTi(): @@ -6726,6 +6748,8 @@ self.ipyRealmXXZLLen = len(self.ipyRealmXXZLCache) self.ipyRealmCache = self.__LoadFileData("Realm", IPY_Realm) self.ipyRealmLen = len(self.ipyRealmCache) + self.ipyRealmTowerCache = self.__LoadFileData("RealmTower", IPY_RealmTower) + self.ipyRealmTowerLen = len(self.ipyRealmTowerCache) self.ipyLianTiCache = self.__LoadFileData("LianTi", IPY_LianTi) self.ipyLianTiLen = len(self.ipyLianTiCache) self.ipyGodWeaponCache = self.__LoadFileData("GodWeapon", IPY_GodWeapon) @@ -7336,6 +7360,8 @@ def GetRealmXXZLByIndex(self, index): return self.ipyRealmXXZLCache[index] def GetRealmCount(self): return self.ipyRealmLen def GetRealmByIndex(self, index): return self.ipyRealmCache[index] + def GetRealmTowerCount(self): return self.ipyRealmTowerLen + def GetRealmTowerByIndex(self, index): return self.ipyRealmTowerCache[index] def GetLianTiCount(self): return self.ipyLianTiLen def GetLianTiByIndex(self, index): return self.ipyLianTiCache[index] def GetGodWeaponCount(self): return self.ipyGodWeaponLen -- Gitblit v1.8.0