From c1c791372b63ff14d0ddd0ef85386e374603d1ff Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 15 七月 2024 19:47:37 +0800 Subject: [PATCH] 10202 【越南】【香港】【主干】【砍树】聚魂(寻宝修改:寻宝设定单独开表;去除免费寻宝x次必出逻辑,免费次数也算常规次数;免费次数去除时间恢复,改为过天重置;每x次必出改为每种类型独立配置;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 72 ++++----- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 63 ++++++- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py | 165 +++++++++---------- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetXunbao.py | 48 ++--- PySysDB/PySysDBPY.h | 25 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py | 4 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 72 ++++----- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 9 8 files changed, 245 insertions(+), 213 deletions(-) diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index 49d68ff..768a184 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -1612,6 +1612,28 @@ list Money; //金钱 }; +//寻宝设定表 + +struct tagTreasureSet +{ + BYTE _TreasureType; //寻宝类型 + BYTE PackType; //放入背包 + BYTE DailyFreeCount; //每日免费次数 + list TreasureCountList; //抽奖次数列表 + DWORD CostItemID; //消耗道具ID + list CostItemCountList; //消耗个数列表 + BYTE CostMoneyType; //消耗货币类型 + list CostMoneyList; //消耗货币列表 + WORD EnsureCount; //每x次必出 + BYTE OnceLucky; //单次幸运值 + WORD FullLucky; //满幸运值 + char LuckyRateFormat; //幸运格子概率公式 + BYTE LuckyGridNum; //幸运格子编号 + list NotifyGridNumList; //需要额外广播的格子 + BYTE AwardMoneyType; //额外奖励货币类型 + WORD AwardMoneyValue; //单次奖励货币数 +}; + //寻宝产出库表 struct tagTreasureHouse @@ -1622,12 +1644,9 @@ dict GridLibInfo; //格子编号对应库ID {"编号":物品库ID, ...} list JobItemList; //职业物品组列表 [[职业1物品, 职业2物品, ...], ...] list GridItemRateListFree; //免费产出格子编号饼图 [[概率, 格子编号], ...] - list FreeGridItemRateList2; //免费每满x次保底产出格子编号饼图 [[概率, 格子编号], ...] - dict FreeGridItemRateList3; //免费第x次必出产出格子编号饼图 {次数:[[概率, 格子编号], ...], ...} list GridItemRateList1; //常规产出格子编号饼图 [[概率, 格子编号], ...] list GridItemRateList2; //每满x次保底产出格子编号饼图 [[概率, 格子编号], ...] dict GridItemRateList3; //第x次必出产出格子编号饼图 {次数:[[概率, 格子编号], ...], ...} - BYTE LuckyGridNum; //幸运加成格子编号 }; //寻宝物品库 diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index 1e534a0..5a731a2 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py @@ -27153,63 +27153,48 @@ # A3 51 寻宝功能信息 #tagMCTreasureInfo class tagMCTreasureTypeInfo(Structure): - TreasureType = 0 #(BYTE TreasureType)//寻宝类型 - LuckValue = 0 #(WORD LuckValue)//当前幸运值 - IndexCount = 0 #(BYTE IndexCount)//索引个数 - FreeCountTime = list() #(vector<DWORD> FreeCountTime)// 模式对应开始计算免费次数时间time值 - data = None + _pack_ = 1 + _fields_ = [ + ("TreasureType", c_ubyte), #寻宝类型 + ("LuckValue", c_ushort), #当前幸运值 + ("TreasureCount", c_int), #已寻宝总次数 + ("FreeCountToday", c_ushort), #今日已免费寻宝次数 + ] def __init__(self): self.Clear() return - def ReadData(self, _lpData, _pos=0, _Len=0): + def ReadData(self, stringData, _pos=0, _len=0): self.Clear() - self.TreasureType,_pos = CommFunc.ReadBYTE(_lpData, _pos) - self.LuckValue,_pos = CommFunc.ReadWORD(_lpData, _pos) - self.IndexCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) - for i in range(self.IndexCount): - value,_pos=CommFunc.ReadDWORD(_lpData,_pos) - self.FreeCountTime.append(value) - return _pos + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() def Clear(self): self.TreasureType = 0 self.LuckValue = 0 - self.IndexCount = 0 - self.FreeCountTime = list() + self.TreasureCount = 0 + self.FreeCountToday = 0 return def GetLength(self): - length = 0 - length += 1 - length += 2 - length += 1 - length += 4 * self.IndexCount - - return length + return sizeof(tagMCTreasureTypeInfo) def GetBuffer(self): - data = '' - data = CommFunc.WriteBYTE(data, self.TreasureType) - data = CommFunc.WriteWORD(data, self.LuckValue) - data = CommFunc.WriteBYTE(data, self.IndexCount) - for i in range(self.IndexCount): - data = CommFunc.WriteDWORD(data, self.FreeCountTime[i]) - return data + return string_at(addressof(self), self.GetLength()) def OutputString(self): - DumpString = ''' + DumpString = '''// A3 51 寻宝功能信息 //tagMCTreasureInfo: TreasureType:%d, LuckValue:%d, - IndexCount:%d, - FreeCountTime:%s + TreasureCount:%d, + FreeCountToday:%d '''\ %( self.TreasureType, self.LuckValue, - self.IndexCount, - "..." + self.TreasureCount, + self.FreeCountToday ) return DumpString @@ -27285,7 +27270,8 @@ class tagMCTreasureResult(Structure): Head = tagHead() - AddTreasureScore = 0 #(WORD AddTreasureScore)// 本次寻宝增加的寻宝积分 + AddMoneyType = 0 #(BYTE AddMoneyType)// 本次寻宝增加的积分货币类型,可能为0 + AddMoneyValue = 0 #(WORD AddMoneyValue)// 本次寻宝增加的积分货币值,可能为0 AddTreasureLuck = 0 #(WORD AddTreasureLuck)// 本次寻宝增加的幸运值 TreasureResultLen = 0 #(WORD TreasureResultLen) TreasureResult = "" #(String TreasureResult)// 获得物品结果[[格子编号, 物品ID,个数,是否绑定], ...] @@ -27300,7 +27286,8 @@ def ReadData(self, _lpData, _pos=0, _Len=0): self.Clear() _pos = self.Head.ReadData(_lpData, _pos) - self.AddTreasureScore,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.AddMoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.AddMoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos) self.AddTreasureLuck,_pos = CommFunc.ReadWORD(_lpData, _pos) self.TreasureResultLen,_pos = CommFunc.ReadWORD(_lpData, _pos) self.TreasureResult,_pos = CommFunc.ReadString(_lpData, _pos,self.TreasureResultLen) @@ -27311,7 +27298,8 @@ self.Head.Clear() self.Head.Cmd = 0xA3 self.Head.SubCmd = 0x50 - self.AddTreasureScore = 0 + self.AddMoneyType = 0 + self.AddMoneyValue = 0 self.AddTreasureLuck = 0 self.TreasureResultLen = 0 self.TreasureResult = "" @@ -27320,6 +27308,7 @@ def GetLength(self): length = 0 length += self.Head.GetLength() + length += 1 length += 2 length += 2 length += 2 @@ -27330,7 +27319,8 @@ def GetBuffer(self): data = '' data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) - data = CommFunc.WriteWORD(data, self.AddTreasureScore) + data = CommFunc.WriteBYTE(data, self.AddMoneyType) + data = CommFunc.WriteWORD(data, self.AddMoneyValue) data = CommFunc.WriteWORD(data, self.AddTreasureLuck) data = CommFunc.WriteWORD(data, self.TreasureResultLen) data = CommFunc.WriteString(data, self.TreasureResultLen, self.TreasureResult) @@ -27339,14 +27329,16 @@ def OutputString(self): DumpString = ''' Head:%s, - AddTreasureScore:%d, + AddMoneyType:%d, + AddMoneyValue:%d, AddTreasureLuck:%d, TreasureResultLen:%d, TreasureResult:%s '''\ %( self.Head.OutputString(), - self.AddTreasureScore, + self.AddMoneyType, + self.AddMoneyValue, self.AddTreasureLuck, self.TreasureResultLen, self.TreasureResult diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py index 1c4247d..3b5608b 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py @@ -3632,13 +3632,8 @@ Def_Player_Dict_RefineGiftCnt = "RefineGiftCnt_%s" #当日已炼制次数, 参数为炼制类型 Def_Player_Dict_RefineStartTime = "RefineStartTime_%s" #炼制活动开始时间, 参数为炼制类型 -Def_PDict_TreasureState = "TreasureState_%s" # 寻宝相关状态,按二进制位存储, 参数(寻宝编号) -Def_PDict_TreasureFreeCnt = "TreasureFreeCnt_%s" # 寻宝 - 当前可用免费次数, 参数(寻宝编号) -Def_PDict_TreasureTodayTotalFreeCnt = "TreasureTTFreeCnt_%s" # 寻宝 - 今日已累计免费次数, 参数(寻宝编号) -Def_PDict_TreasureStartCalcFreeCntTime = "TreasureFreeCntTime_%s" # 寻宝 - 开始计算免费次数CD时间, 参数(寻宝编号) - -Def_PDict_TreasureFreeTime = "TreasureFreeTime_%s_%s" # 寻宝开始免费计时time值, 参数(寻宝类型, 寻宝索引) -Def_PDict_TreasureCount = "TreasureCount_%s_%s" # 寻宝次数, 参数(寻宝类型,是否免费) +Def_PDict_TreasureFreeCount = "TreasureFreeCount_%s" # 寻宝今日已使用免费次数, 参数(寻宝类型) +Def_PDict_TreasureCount = "TreasureCount_%s" # 寻宝次数, 参数(寻宝类型) Def_PDict_TreasureLuck = "TreasureLuck_%s" # 寻宝当前幸运值, 参数(寻宝类型) Def_Player_Dict_LastAutoOpenPackTick = "LastAutoOpenPackTick219_%s" #上一次自动购买的tick<背包类型> diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index 1e534a0..5a731a2 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -27153,63 +27153,48 @@ # A3 51 寻宝功能信息 #tagMCTreasureInfo class tagMCTreasureTypeInfo(Structure): - TreasureType = 0 #(BYTE TreasureType)//寻宝类型 - LuckValue = 0 #(WORD LuckValue)//当前幸运值 - IndexCount = 0 #(BYTE IndexCount)//索引个数 - FreeCountTime = list() #(vector<DWORD> FreeCountTime)// 模式对应开始计算免费次数时间time值 - data = None + _pack_ = 1 + _fields_ = [ + ("TreasureType", c_ubyte), #寻宝类型 + ("LuckValue", c_ushort), #当前幸运值 + ("TreasureCount", c_int), #已寻宝总次数 + ("FreeCountToday", c_ushort), #今日已免费寻宝次数 + ] def __init__(self): self.Clear() return - def ReadData(self, _lpData, _pos=0, _Len=0): + def ReadData(self, stringData, _pos=0, _len=0): self.Clear() - self.TreasureType,_pos = CommFunc.ReadBYTE(_lpData, _pos) - self.LuckValue,_pos = CommFunc.ReadWORD(_lpData, _pos) - self.IndexCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) - for i in range(self.IndexCount): - value,_pos=CommFunc.ReadDWORD(_lpData,_pos) - self.FreeCountTime.append(value) - return _pos + memmove(addressof(self), stringData[_pos:], self.GetLength()) + return _pos + self.GetLength() def Clear(self): self.TreasureType = 0 self.LuckValue = 0 - self.IndexCount = 0 - self.FreeCountTime = list() + self.TreasureCount = 0 + self.FreeCountToday = 0 return def GetLength(self): - length = 0 - length += 1 - length += 2 - length += 1 - length += 4 * self.IndexCount - - return length + return sizeof(tagMCTreasureTypeInfo) def GetBuffer(self): - data = '' - data = CommFunc.WriteBYTE(data, self.TreasureType) - data = CommFunc.WriteWORD(data, self.LuckValue) - data = CommFunc.WriteBYTE(data, self.IndexCount) - for i in range(self.IndexCount): - data = CommFunc.WriteDWORD(data, self.FreeCountTime[i]) - return data + return string_at(addressof(self), self.GetLength()) def OutputString(self): - DumpString = ''' + DumpString = '''// A3 51 寻宝功能信息 //tagMCTreasureInfo: TreasureType:%d, LuckValue:%d, - IndexCount:%d, - FreeCountTime:%s + TreasureCount:%d, + FreeCountToday:%d '''\ %( self.TreasureType, self.LuckValue, - self.IndexCount, - "..." + self.TreasureCount, + self.FreeCountToday ) return DumpString @@ -27285,7 +27270,8 @@ class tagMCTreasureResult(Structure): Head = tagHead() - AddTreasureScore = 0 #(WORD AddTreasureScore)// 本次寻宝增加的寻宝积分 + AddMoneyType = 0 #(BYTE AddMoneyType)// 本次寻宝增加的积分货币类型,可能为0 + AddMoneyValue = 0 #(WORD AddMoneyValue)// 本次寻宝增加的积分货币值,可能为0 AddTreasureLuck = 0 #(WORD AddTreasureLuck)// 本次寻宝增加的幸运值 TreasureResultLen = 0 #(WORD TreasureResultLen) TreasureResult = "" #(String TreasureResult)// 获得物品结果[[格子编号, 物品ID,个数,是否绑定], ...] @@ -27300,7 +27286,8 @@ def ReadData(self, _lpData, _pos=0, _Len=0): self.Clear() _pos = self.Head.ReadData(_lpData, _pos) - self.AddTreasureScore,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.AddMoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.AddMoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos) self.AddTreasureLuck,_pos = CommFunc.ReadWORD(_lpData, _pos) self.TreasureResultLen,_pos = CommFunc.ReadWORD(_lpData, _pos) self.TreasureResult,_pos = CommFunc.ReadString(_lpData, _pos,self.TreasureResultLen) @@ -27311,7 +27298,8 @@ self.Head.Clear() self.Head.Cmd = 0xA3 self.Head.SubCmd = 0x50 - self.AddTreasureScore = 0 + self.AddMoneyType = 0 + self.AddMoneyValue = 0 self.AddTreasureLuck = 0 self.TreasureResultLen = 0 self.TreasureResult = "" @@ -27320,6 +27308,7 @@ def GetLength(self): length = 0 length += self.Head.GetLength() + length += 1 length += 2 length += 2 length += 2 @@ -27330,7 +27319,8 @@ def GetBuffer(self): data = '' data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) - data = CommFunc.WriteWORD(data, self.AddTreasureScore) + data = CommFunc.WriteBYTE(data, self.AddMoneyType) + data = CommFunc.WriteWORD(data, self.AddMoneyValue) data = CommFunc.WriteWORD(data, self.AddTreasureLuck) data = CommFunc.WriteWORD(data, self.TreasureResultLen) data = CommFunc.WriteString(data, self.TreasureResultLen, self.TreasureResult) @@ -27339,14 +27329,16 @@ def OutputString(self): DumpString = ''' Head:%s, - AddTreasureScore:%d, + AddMoneyType:%d, + AddMoneyValue:%d, AddTreasureLuck:%d, TreasureResultLen:%d, TreasureResult:%s '''\ %( self.Head.OutputString(), - self.AddTreasureScore, + self.AddMoneyType, + self.AddMoneyValue, self.AddTreasureLuck, self.TreasureResultLen, self.TreasureResult diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetXunbao.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetXunbao.py index 5b1bfe6..8d8cf68 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetXunbao.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetXunbao.py @@ -19,11 +19,9 @@ import ShareDefine import PlayerControl import PlayerTreasure -import IpyGameDataPY import ClearPack import ChConfig - -import time +import IpyGameDataPY ## GM命令执行入口 # @param curPlayer 当前玩家 @@ -32,37 +30,33 @@ # @remarks 函数详细说明. def OnExec(curPlayer, paramList): if not paramList: - GameWorld.DebugAnswer(curPlayer, "重置寻宝:SetXunbao 0 选填(是否免费 清空背包)") - GameWorld.DebugAnswer(curPlayer, "设置幸运:SetXunbao 寻宝类型 幸运值") + GameWorld.DebugAnswer(curPlayer, "重置寻宝:SetXunbao 0") + GameWorld.DebugAnswer(curPlayer, "设置幸运:SetXunbao 寻宝类型 幸运值 已寻宝次数") return if not paramList[0]: - isFree = paramList[1] if len(paramList) > 1 else 1 - isClearPack = paramList[2] if len(paramList) > 2 else 1 + ClearPack.OnExec(curPlayer, [ShareDefine.rptTreasure]) + ClearPack.OnExec(curPlayer, [ShareDefine.rptRune]) - if isClearPack: - ClearPack.OnExec(curPlayer, [ShareDefine.rptTreasure]) - ClearPack.OnExec(curPlayer, [ShareDefine.rptRune]) - - treasureTypeList = PlayerTreasure.GetTreasureTypeList() - for treasureType in treasureTypeList: - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType, 0), 0) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType, 1), 0) + ipyDataMgr = IpyGameDataPY.IPY_Data() + for i in xrange(ipyDataMgr.GetTreasureSetCount()): + ipyData = ipyDataMgr.GetTreasureSetByIndex(i) + treasureType = ipyData.GetTreasureType() + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType), 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureLuck % (treasureType), 0) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeCount % (treasureType), 0) - if not isFree: - continue - - freeTimeCDList = IpyGameDataPY.GetFuncEvalCfg("TreasureSet1%s" % treasureType, 4) - for i, minute in enumerate(freeTimeCDList): - if not minute: - continue - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeTime % (treasureType, i), int(time.time()) - minute * 60) GameWorld.DebugAnswer(curPlayer, "重置寻宝OK!") - elif len(paramList) == 2: - treasureType, luck = paramList - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureLuck % (treasureType), luck) - GameWorld.DebugAnswer(curPlayer, "设置寻宝类型=%s,幸运=%s" % (treasureType, luck)) + else: + treasureType = paramList[0] + luck = paramList[1] if len(paramList) > 1 else None + treasureCount = paramList[2] if len(paramList) > 2 else None + if luck != None: + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureLuck % (treasureType), luck) + GameWorld.DebugAnswer(curPlayer, "设置寻宝类型=%s,幸运=%s" % (treasureType, luck)) + if treasureCount != None: + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType), treasureCount) + GameWorld.DebugAnswer(curPlayer, "设置寻宝类型=%s,次数=%s" % (treasureType, treasureCount)) PlayerTreasure.Sync_TreasureInfo(curPlayer) return True diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index 5fe1aa7..dcd9de4 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py @@ -1286,6 +1286,25 @@ ("list", "Money", 0), ), + "TreasureSet":( + ("BYTE", "TreasureType", 1), + ("BYTE", "PackType", 0), + ("BYTE", "DailyFreeCount", 0), + ("list", "TreasureCountList", 0), + ("DWORD", "CostItemID", 0), + ("list", "CostItemCountList", 0), + ("BYTE", "CostMoneyType", 0), + ("list", "CostMoneyList", 0), + ("WORD", "EnsureCount", 0), + ("BYTE", "OnceLucky", 0), + ("WORD", "FullLucky", 0), + ("char", "LuckyRateFormat", 0), + ("BYTE", "LuckyGridNum", 0), + ("list", "NotifyGridNumList", 0), + ("BYTE", "AwardMoneyType", 0), + ("WORD", "AwardMoneyValue", 0), + ), + "TreasureHouse":( ("BYTE", "TreasureType", 1), ("WORD", "MinLV", 0), @@ -1293,12 +1312,9 @@ ("dict", "GridLibInfo", 0), ("list", "JobItemList", 0), ("list", "GridItemRateListFree", 0), - ("list", "FreeGridItemRateList2", 0), - ("dict", "FreeGridItemRateList3", 0), ("list", "GridItemRateList1", 0), ("list", "GridItemRateList2", 0), ("dict", "GridItemRateList3", 0), - ("BYTE", "LuckyGridNum", 0), ), "TreasureItemLib":( @@ -4178,6 +4194,30 @@ def GetAwardItem(self): return self.attrTuple[5] # 奖励物品列表 list def GetMoney(self): return self.attrTuple[6] # 金钱 list +# 寻宝设定表 +class IPY_TreasureSet(): + + def __init__(self): + self.attrTuple = None + return + + def GetTreasureType(self): return self.attrTuple[0] # 寻宝类型 BYTE + def GetPackType(self): return self.attrTuple[1] # 放入背包 BYTE + def GetDailyFreeCount(self): return self.attrTuple[2] # 每日免费次数 BYTE + def GetTreasureCountList(self): return self.attrTuple[3] # 抽奖次数列表 list + def GetCostItemID(self): return self.attrTuple[4] # 消耗道具ID DWORD + def GetCostItemCountList(self): return self.attrTuple[5] # 消耗个数列表 list + def GetCostMoneyType(self): return self.attrTuple[6] # 消耗货币类型 BYTE + def GetCostMoneyList(self): return self.attrTuple[7] # 消耗货币列表 list + def GetEnsureCount(self): return self.attrTuple[8] # 每x次必出 WORD + def GetOnceLucky(self): return self.attrTuple[9] # 单次幸运值 BYTE + def GetFullLucky(self): return self.attrTuple[10] # 满幸运值 WORD + def GetLuckyRateFormat(self): return self.attrTuple[11] # 幸运格子概率公式 char + def GetLuckyGridNum(self): return self.attrTuple[12] # 幸运格子编号 BYTE + def GetNotifyGridNumList(self): return self.attrTuple[13] # 需要额外广播的格子 list + def GetAwardMoneyType(self): return self.attrTuple[14] # 额外奖励货币类型 BYTE + def GetAwardMoneyValue(self): return self.attrTuple[15] # 单次奖励货币数 WORD + # 寻宝产出库表 class IPY_TreasureHouse(): @@ -4191,12 +4231,9 @@ def GetGridLibInfo(self): return self.attrTuple[3] # 格子编号对应库ID {"编号":物品库ID, ...} dict def GetJobItemList(self): return self.attrTuple[4] # 职业物品组列表 [[职业1物品, 职业2物品, ...], ...] list def GetGridItemRateListFree(self): return self.attrTuple[5] # 免费产出格子编号饼图 [[概率, 格子编号], ...] list - def GetFreeGridItemRateList2(self): return self.attrTuple[6] # 免费每满x次保底产出格子编号饼图 [[概率, 格子编号], ...] list - def GetFreeGridItemRateList3(self): return self.attrTuple[7] # 免费第x次必出产出格子编号饼图 {次数:[[概率, 格子编号], ...], ...} dict - def GetGridItemRateList1(self): return self.attrTuple[8] # 常规产出格子编号饼图 [[概率, 格子编号], ...] list - def GetGridItemRateList2(self): return self.attrTuple[9] # 每满x次保底产出格子编号饼图 [[概率, 格子编号], ...] list - def GetGridItemRateList3(self): return self.attrTuple[10] # 第x次必出产出格子编号饼图 {次数:[[概率, 格子编号], ...], ...} dict - def GetLuckyGridNum(self): return self.attrTuple[11] # 幸运加成格子编号 BYTE + def GetGridItemRateList1(self): return self.attrTuple[6] # 常规产出格子编号饼图 [[概率, 格子编号], ...] list + def GetGridItemRateList2(self): return self.attrTuple[7] # 每满x次保底产出格子编号饼图 [[概率, 格子编号], ...] list + def GetGridItemRateList3(self): return self.attrTuple[8] # 第x次必出产出格子编号饼图 {次数:[[概率, 格子编号], ...], ...} dict # 寻宝物品库 class IPY_TreasureItemLib(): @@ -6026,6 +6063,7 @@ self.__LoadFileData("LVAward", onlyCheck) self.__LoadFileData("Invest", onlyCheck) self.__LoadFileData("XBXZ", onlyCheck) + self.__LoadFileData("TreasureSet", onlyCheck) self.__LoadFileData("TreasureHouse", onlyCheck) self.__LoadFileData("TreasureItemLib", onlyCheck) self.__LoadFileData("FreeGoods", onlyCheck) @@ -7167,6 +7205,13 @@ self.CheckLoadData("XBXZ") return self.ipyXBXZCache[index] + def GetTreasureSetCount(self): + self.CheckLoadData("TreasureSet") + return self.ipyTreasureSetLen + def GetTreasureSetByIndex(self, index): + self.CheckLoadData("TreasureSet") + return self.ipyTreasureSetCache[index] + def GetTreasureHouseCount(self): self.CheckLoadData("TreasureHouse") return self.ipyTreasureHouseLen diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py index 68372d8..fb77fcb 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py @@ -119,6 +119,7 @@ import PlayerWishingWell import PlayerFairyDomain import CrossPlayerData +import PlayerTreasure import PlayerVip import PlayerLove import PlayerDiceEx @@ -543,7 +544,8 @@ #投资 PlayerGoldInvest.OnDay(curPlayer) - + #寻宝 + PlayerTreasure.OnDay(curPlayer) #法宝 PlayerMagicWeapon.OnDay(curPlayer) PlayerGoldGift.OnDay(curPlayer) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py index 2ba1cad..9f0472a 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py @@ -45,15 +45,6 @@ def DoTreasureOpen(curPlayer): ## 寻宝开启 - - # 设置免费寻宝 - treasureTypeList = GetTreasureTypeList() - for treasureType in treasureTypeList: - freeTimeCDList = IpyGameDataPY.GetFuncEvalCfg("TreasureSet1%s" % treasureType, 4) - for i, minute in enumerate(freeTimeCDList): - if not minute: - continue - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeTime % (treasureType, i), int(time.time()) - minute * 60) Sync_TreasureInfo(curPlayer) return @@ -61,6 +52,20 @@ if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Treasure): return Sync_TreasureInfo(curPlayer) + return + +def OnDay(curPlayer): + syncTypeList = [] + ipyDataMgr = IpyGameDataPY.IPY_Data() + for i in xrange(ipyDataMgr.GetTreasureSetCount()): + ipyData = ipyDataMgr.GetTreasureSetByIndex(i) + treasureType = ipyData.GetTreasureType() + if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeCount % (treasureType)): + continue + syncTypeList.append(treasureType) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeCount % (treasureType), 0) + if syncTypeList: + Sync_TreasureInfo(curPlayer, syncTypeList) return #// A5 68 请求寻宝 #tagCMRequestTreasure @@ -79,13 +84,14 @@ treasureType = clientData.TreasureType treasureIndex = clientData.TreasureIndex costType = clientData.CostType - isFreeType = 1 if costType == 1 else 0 + GameWorld.DebugLog("玩家寻宝: treasureType=%s,treasureIndex=%s,costType=%s,playerLV=%s" % (treasureType, treasureIndex, costType, playerLV), playerID) - TreasureSet1 = "TreasureSet1%s" % treasureType - TreasureSet2 = "TreasureSet2%s" % treasureType - treasureCountList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 1) # 寻宝获得个数列表 + setIpyData = IpyGameDataPY.GetIpyGameData("TreasureSet", treasureType) + if not setIpyData: + return + treasureCountList = setIpyData.GetTreasureCountList() # 寻宝获得个数列表 if not treasureCountList: GameWorld.DebugLog("没有寻宝次数列表配置!", playerID) return @@ -97,37 +103,31 @@ GameWorld.DebugLog("没有寻宝次数配置!", playerID) return - packType = ShareDefine.rptTreasure - #if treasureType == 2: - # packType = ShareDefine.rptRune - if treasureType in [TreasureType_GatherTheSoul]: - packType = IPY_GameWorld.rptItem - + packType = setIpyData.GetPackType() if not ItemCommon.CheckPackHasSpace(curPlayer, packType, True): GameWorld.DebugLog("对应寻宝背包没有空格子!packType=%s" % packType, playerID) return # 免费次数 if costType == 1: - freeCountCDList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 4) # 免费次数CD时间列表, 分 - freeCountCD = freeCountCDList[treasureIndex] * 60 - if not freeCountCD: + dailyFreeCount = setIpyData.GetDailyFreeCount() + if not dailyFreeCount: GameWorld.ErrLog("该寻宝类型索引不支持免费次数寻宝!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) return - curTime = int(time.time()) - freeTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeTime % (treasureType, treasureIndex)) - if curTime - freeTime < freeCountCD: - GameWorld.DebugLog("免费寻宝CD时间未到,无法使用免费寻宝!curTime=%s,freeTime=%s, %s < freeCountCD(%s)" - % (curTime, freeTime, curTime - freeTime, freeCountCD), playerID) + freeCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeCount % (treasureType)) + updFreeCountToday = freeCountToday + treasureCount + if updFreeCountToday > dailyFreeCount: + GameWorld.DebugLog("今日免费次数不足,无法使用免费寻宝! freeCountToday=%s + %s > %s" % (freeCountToday, treasureCount, dailyFreeCount), playerID) return # 寻宝道具, 目前默认消耗1个 elif costType == 2: - costItemList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 3) # 消耗道具物品ID列表 - if not costItemList: + costItemID = setIpyData.GetCostItemID() + costItemList = setIpyData.GetCostItemCountList() # 消耗道具物品ID列表 + if not costItemID or not costItemList or treasureIndex >= len(costItemList): GameWorld.ErrLog("该寻宝类型索引不支持消耗道具寻宝!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) return - costItemID, costItemNeedCount = costItemList[treasureIndex] + costItemNeedCount = costItemList[treasureIndex] if not costItemID or not costItemNeedCount: return costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID) @@ -148,11 +148,13 @@ # 仙玉寻宝 else: - costGoldList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 2) # 消耗货币列表 - costGoldType = IpyGameDataPY.GetFuncCfg(TreasureSet2, 4) # 消耗货币类型 + costGoldList = setIpyData.GetCostMoneyList() # 消耗货币列表 + costGoldType = setIpyData.GetCostMoneyType() # 消耗货币类型 + if not costGoldType or not costGoldList or treasureIndex >= len(costGoldList): + GameWorld.ErrLog("该寻宝类型索引不支持消耗货币寻宝!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) + return costGold = costGoldList[treasureIndex] if not costGold: - GameWorld.ErrLog("该寻宝类型索引不支持消耗仙玉寻宝!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) return if not PlayerControl.HaveMoney(curPlayer, costGoldType, costGold): @@ -163,39 +165,40 @@ GameWorld.ErrLog("找不到该等级对应寻宝库配置!treasureType=%s,curLV=%s" % (treasureType, curPlayer.GetLV()), playerID) return - luckFormula = IpyGameDataPY.GetFuncCfg(TreasureSet2, 1) # 幸运物品概率公式 - addLuck = IpyGameDataPY.GetFuncEvalCfg(TreasureSet2, 2)[treasureIndex] # 增加幸运值 - maxLuck = IpyGameDataPY.GetFuncCfg(TreasureSet2, 3) # 满幸运值 + luckyGridNum = setIpyData.GetLuckyGridNum() # 幸运物品概率公式 + luckFormula = setIpyData.GetLuckyRateFormat() # 幸运物品概率公式 + addLuck = setIpyData.GetOnceLucky() * treasureCount # 增加幸运值 + maxLuck = setIpyData.GetFullLucky() # 满幸运值 curLuck = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (treasureType)) # 当前幸运值 updLuck = curLuck + addLuck - commItemRateList = GetUpdLuckyItemRateList(ipyData, curLuck, luckFormula, costType) # 常规产出物品格子饼图,幸运物品概率已变更 + commItemRateList = GetUpdLuckyItemRateList(ipyData, luckyGridNum, curLuck, luckFormula, costType) # 常规产出物品格子饼图,幸运物品概率已变更 - curTreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (treasureType, isFreeType)) # 当前已寻宝次数 + curTreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (treasureType)) # 当前已寻宝次数 updTreasureCount = curTreasureCount + treasureCount - beSureCountDict = ipyData.GetFreeGridItemRateList3() if isFreeType else ipyData.GetGridItemRateList3() # 第x次必出产出格子编号饼图 GameWorld.DebugLog("已经寻宝次数=%s,当前幸运=%s,commItemRateList=%s" % (curTreasureCount, curLuck, commItemRateList), playerID) - addScore = 0 if isFreeType else IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 5)[treasureIndex] # 增加积分 - ensureCount = IpyGameDataPY.GetFuncEvalCfg("TreasureSet", 1, {})[isFreeType] # 每多少次触发保底产出库 - ensureRateList = ipyData.GetFreeGridItemRateList2() if isFreeType else ipyData.GetGridItemRateList2() - goodGridNumList = [ipyData.GetLuckyGridNum()] # 好物品格子编号 (幸运物品 + 必出 + 保底) + + goodGridNumList = [luckyGridNum] # 好物品格子编号 (幸运物品 + 必出 + 保底) + beSureCountDict = ipyData.GetGridItemRateList3() # 第x次必出产出格子编号饼图 for gridRateList in beSureCountDict.values(): for gridRateInfo in gridRateList: goodGridNumList.append(gridRateInfo[1]) + ensureCount = setIpyData.GetEnsureCount() # 每多少次触发保底产出库 + ensureRateList = ipyData.GetGridItemRateList2() for gridRateInfo in ensureRateList: goodGridNumList.append(gridRateInfo[1]) - notifyGridNumList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet2, 5) # 额外需要广播的格子,幸运必出、次数必出可不配置 + notifyGridNumList = setIpyData.GetNotifyGridNumList() # 额外需要广播的格子,幸运必出、次数必出可不配置 goodGridNumList += notifyGridNumList GameWorld.DebugLog("goodGridNumList=%s" % goodGridNumList, playerID) - + # 单抽产出优先级: 幸运物品 > 必出 > 保底 > 普通 # 连抽没有优先级限制,只要满足条件即可产出 getGridResult = [] # 1.满幸运必出 if updLuck >= maxLuck: - getGridResult.append(ipyData.GetLuckyGridNum()) - GameWorld.DebugLog("满幸运必出幸运物品: gridNum=%s" % ipyData.GetLuckyGridNum(), playerID) + getGridResult.append(luckyGridNum) + GameWorld.DebugLog("满幸运必出幸运物品: luckyGridNum=%s" % luckyGridNum, playerID) # 单抽 if treasureCount == 1: @@ -242,7 +245,7 @@ doCount -= 1 gridNum = GameWorld.GetResultByRandomList(commItemRateList) - if gridNum == ipyData.GetLuckyGridNum() and gridNum in getGridResult: + if gridNum == luckyGridNum and gridNum in getGridResult: GameWorld.DebugLog("幸运物品已经出过,不再重复产出!") continue @@ -283,7 +286,7 @@ isBind = 0 # 暂时默认不绑定 job = curPlayer.GetJob() gridItemInfoDict = ipyData.GetGridItemInfo() # 格子对应物品信息 {"格子编号":[物品ID, 数量], ...} - gridLibInfoDict = ipyData.GetGridLibInfo() # 格子对应物品信息 {"格子编号":[物品ID, 数量], ...} + gridLibInfoDict = ipyData.GetGridLibInfo() # 格子编号对应库ID {"编号":物品库ID, ...} jobItemList = ipyData.GetJobItemList() treasureResult = [] randItemIDDict = IpyGameDataPY.GetFuncEvalCfg("TreasureSet", 2) @@ -338,8 +341,8 @@ # 扣消耗 if costType == 1: - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeTime % (treasureType, treasureIndex), curTime) - GameWorld.DebugLog("消耗免费次数,更新免费CD计算时间: %s" % curTime, playerID) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeCount % (treasureType), updFreeCountToday) + GameWorld.DebugLog("消耗免费次数,更新今日已使用免费次数: %s" % updFreeCountToday, playerID) elif costType == 2: ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCostItemCount, ChConfig.ItemDel_Treasure) GameWorld.DebugLog("扣除寻宝道具,costItemID=%s,delCostItemCount=%s" % (costItemID, delCostItemCount), playerID) @@ -352,12 +355,16 @@ GameWorld.DebugLog("扣除货币,costGoldType=%s,costGold=%s" % (costGoldType, costGold), playerID) # 加数据 - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType, isFreeType), updTreasureCount) - if ipyData.GetLuckyGridNum() in getGridResult: + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType), updTreasureCount) + if luckyGridNum in getGridResult: updLuck = 0 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureLuck % (treasureType), updLuck) - PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_TreasureScore, addScore) + addScoreType = setIpyData.GetAwardMoneyType() # 额外奖励货币类型 + addScore = setIpyData.GetAwardMoneyValue() # 单次奖励货币数 + if addScoreType and addScore: + PlayerControl.GiveMoney(curPlayer, addScoreType, addScore) + if treasureType == TreasureType_Rune: PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RuneTreasure, treasureCount) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_RuneTreasure, treasureCount) @@ -390,28 +397,30 @@ if mailItemList: PlayerControl.SendMailByKey("HappyXBUnEnough", [playerID], mailItemList) - GameWorld.DebugLog("寻宝成功: treasureType=%s,updTreasureCount=%s,updLuck=%s,addLuck=%s,addScore=%s" - % (treasureType, updTreasureCount, updLuck, addLuck, addScore), playerID) + GameWorld.DebugLog("寻宝成功: treasureType=%s,updTreasureCount=%s,updLuck=%s,addLuck=%s,addScoreType=%s,addScore=%s" + % (treasureType, updTreasureCount, updLuck, addLuck, addScoreType, addScore), playerID) GameWorld.DebugLog(" treasureResult=%s" % (treasureResult), playerID) GameWorld.DebugLog(" mailItemList=%s" % (mailItemList), playerID) # 通知前端 sendPack = ChPyNetSendPack.tagMCTreasureResult() sendPack.Clear() - sendPack.AddTreasureScore = addScore + sendPack.AddMoneyType = addScoreType + sendPack.AddMoneyValue = addScore sendPack.AddTreasureLuck = addLuck sendPack.TreasureResult = str(treasureResult) sendPack.TreasureResultLen = len(sendPack.TreasureResult) NetPackCommon.SendFakePack(curPlayer, sendPack) - Sync_TreasureInfo(curPlayer, treasureType) + Sync_TreasureInfo(curPlayer, [treasureType]) return -def GetUpdLuckyItemRateList(ipyData, curLuck, luckFormula, costType): +def GetUpdLuckyItemRateList(ipyData, luckyGridNum, curLuck, luckFormula, costType): # 获取幸运物品提升概率后的饼图 srcPieList = ipyData.GetGridItemRateListFree() if costType == 1 else ipyData.GetGridItemRateList1() - luckyGridNum = ipyData.GetLuckyGridNum() - + if not srcPieList: + srcPieList = ipyData.GetGridItemRateList1() + updRateList = [] for i, rateInfo in enumerate(srcPieList): rate, gridNum = rateInfo @@ -440,42 +449,26 @@ return jobItemIDList[job - 1] return itemID -def GetTreasureTypeList(): - ## 寻宝类型列表 - TreasureTypeList = IpyGameDataPY.GetConfigEx("TreasureType") - if not TreasureTypeList: - TreasureTypeList = [] +def Sync_TreasureInfo(curPlayer, syncTypeList=None): + if syncTypeList == None: + syncTypeList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() - for i in xrange(ipyDataMgr.GetTreasureHouseCount()): - ipyData = ipyDataMgr.GetTreasureHouseByIndex(i) - treasureType = ipyData.GetTreasureType() - if treasureType not in TreasureTypeList: - TreasureTypeList.append(treasureType) - IpyGameDataPY.SetConfigEx("TreasureType", TreasureTypeList) - return TreasureTypeList - -def Sync_TreasureInfo(curPlayer, treasureType=None): - if treasureType == None: - syncTypeList = GetTreasureTypeList() - else: - syncTypeList = [treasureType] - + for i in xrange(ipyDataMgr.GetTreasureSetCount()): + ipyData = ipyDataMgr.GetTreasureSetByIndex(i) + syncTypeList.append(ipyData.GetTreasureType()) + treasureInfoPack = ChPyNetSendPack.tagMCTreasureInfo() treasureInfoPack.Clear() treasureInfoPack.TreasuerInfoList = [] for tType in syncTypeList: - treasureCountList = IpyGameDataPY.GetFuncEvalCfg("TreasureSet1%s" % tType, 1) tTypeInfo = ChPyNetSendPack.tagMCTreasureTypeInfo() tTypeInfo.Clear() tTypeInfo.TreasureType = tType tTypeInfo.LuckValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (tType)) - tTypeInfo.FreeCountTime = [] - for i in xrange(len(treasureCountList)): - tTypeInfo.FreeCountTime.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeTime % (tType, i))) - tTypeInfo.IndexCount = len(tTypeInfo.FreeCountTime) + tTypeInfo.TreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (tType)) + tTypeInfo.FreeCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeCount % (tType)) treasureInfoPack.TreasuerInfoList.append(tTypeInfo) treasureInfoPack.InfoCount = len(treasureInfoPack.TreasuerInfoList) NetPackCommon.SendFakePack(curPlayer, treasureInfoPack) return - -- Gitblit v1.8.0