From ac415b81547ada883896d409e2f83ab7faac819f Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期六, 28 九月 2024 15:29:51 +0800 Subject: [PATCH] 10253 【越南】【砍树】【英文】聚魂 和 古宝获得物品展示(支持多选) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_Chests.py | 31 ++++-- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 115 ++++++++++++++++++---- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py | 21 +++ ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 115 ++++++++++++++++++---- 4 files changed, 223 insertions(+), 59 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py index e0356cc..975cb40 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py @@ -9902,20 +9902,15 @@ #------------------------------------------------------ # A3 23 使用物品 #tagCMUseItems -class tagCMUseItems(Structure): +class tagCMUseItemsSelect(Structure): _pack_ = 1 _fields_ = [ - ("Cmd", c_ubyte), - ("SubCmd", c_ubyte), - ("ItemIndex", c_ubyte), #物品在背包中索引 - ("UseCnt", c_ushort), #使用个数,0表示全部使用 - ("ExData", c_int), #使用扩展值, 默认0, 选择物品宝箱时发送选择的物品ID + ("SelectID", c_int), #选择项ID + ("SelectCnt", c_ushort), #选择数 ] def __init__(self): self.Clear() - self.Cmd = 0xA3 - self.SubCmd = 0x23 return def ReadData(self, stringData, _pos=0, _len=0): @@ -9924,39 +9919,113 @@ return _pos + self.GetLength() def Clear(self): - self.Cmd = 0xA3 - self.SubCmd = 0x23 - self.ItemIndex = 0 - self.UseCnt = 0 - self.ExData = 0 + self.SelectID = 0 + self.SelectCnt = 0 return def GetLength(self): - return sizeof(tagCMUseItems) + return sizeof(tagCMUseItemsSelect) def GetBuffer(self): return string_at(addressof(self), self.GetLength()) def OutputString(self): DumpString = '''// A3 23 使用物品 //tagCMUseItems: - Cmd:%s, - SubCmd:%s, - ItemIndex:%d, - UseCnt:%d, - ExData:%d + SelectID:%d, + SelectCnt:%d '''\ %( - self.Cmd, - self.SubCmd, + self.SelectID, + self.SelectCnt + ) + return DumpString + + +class tagCMUseItems(Structure): + Head = tagHead() + ItemIndex = 0 #(BYTE ItemIndex)//物品在背包中索引 + UseCnt = 0 #(WORD UseCnt)//使用个数,0表示全部使用 + ExData = 0 #(DWORD ExData)//使用扩展值, 默认0, 选择物品宝箱时发送选择的物品ID + SelectCount = 0 #(BYTE SelectCount)//指定选择项,当批量使用单个箱子需要同时选中多种选项时使用该值 + SelectList = list() #(vector<tagCMUseItemsSelect> SelectList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0x23 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.ItemIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.UseCnt,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.ExData,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.SelectCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.SelectCount): + temSelectList = tagCMUseItemsSelect() + _pos = temSelectList.ReadData(_lpData, _pos) + self.SelectList.append(temSelectList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0x23 + self.ItemIndex = 0 + self.UseCnt = 0 + self.ExData = 0 + self.SelectCount = 0 + self.SelectList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 2 + length += 4 + length += 1 + for i in range(self.SelectCount): + length += self.SelectList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.ItemIndex) + data = CommFunc.WriteWORD(data, self.UseCnt) + data = CommFunc.WriteDWORD(data, self.ExData) + data = CommFunc.WriteBYTE(data, self.SelectCount) + for i in range(self.SelectCount): + data = CommFunc.WriteString(data, self.SelectList[i].GetLength(), self.SelectList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + ItemIndex:%d, + UseCnt:%d, + ExData:%d, + SelectCount:%d, + SelectList:%s + '''\ + %( + self.Head.OutputString(), self.ItemIndex, self.UseCnt, - self.ExData + self.ExData, + self.SelectCount, + "..." ) return DumpString m_NAtagCMUseItems=tagCMUseItems() -ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMUseItems.Cmd,m_NAtagCMUseItems.SubCmd))] = m_NAtagCMUseItems +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMUseItems.Head.Cmd,m_NAtagCMUseItems.Head.SubCmd))] = m_NAtagCMUseItems #------------------------------------------------------ diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py index e0356cc..975cb40 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py @@ -9902,20 +9902,15 @@ #------------------------------------------------------ # A3 23 使用物品 #tagCMUseItems -class tagCMUseItems(Structure): +class tagCMUseItemsSelect(Structure): _pack_ = 1 _fields_ = [ - ("Cmd", c_ubyte), - ("SubCmd", c_ubyte), - ("ItemIndex", c_ubyte), #物品在背包中索引 - ("UseCnt", c_ushort), #使用个数,0表示全部使用 - ("ExData", c_int), #使用扩展值, 默认0, 选择物品宝箱时发送选择的物品ID + ("SelectID", c_int), #选择项ID + ("SelectCnt", c_ushort), #选择数 ] def __init__(self): self.Clear() - self.Cmd = 0xA3 - self.SubCmd = 0x23 return def ReadData(self, stringData, _pos=0, _len=0): @@ -9924,39 +9919,113 @@ return _pos + self.GetLength() def Clear(self): - self.Cmd = 0xA3 - self.SubCmd = 0x23 - self.ItemIndex = 0 - self.UseCnt = 0 - self.ExData = 0 + self.SelectID = 0 + self.SelectCnt = 0 return def GetLength(self): - return sizeof(tagCMUseItems) + return sizeof(tagCMUseItemsSelect) def GetBuffer(self): return string_at(addressof(self), self.GetLength()) def OutputString(self): DumpString = '''// A3 23 使用物品 //tagCMUseItems: - Cmd:%s, - SubCmd:%s, - ItemIndex:%d, - UseCnt:%d, - ExData:%d + SelectID:%d, + SelectCnt:%d '''\ %( - self.Cmd, - self.SubCmd, + self.SelectID, + self.SelectCnt + ) + return DumpString + + +class tagCMUseItems(Structure): + Head = tagHead() + ItemIndex = 0 #(BYTE ItemIndex)//物品在背包中索引 + UseCnt = 0 #(WORD UseCnt)//使用个数,0表示全部使用 + ExData = 0 #(DWORD ExData)//使用扩展值, 默认0, 选择物品宝箱时发送选择的物品ID + SelectCount = 0 #(BYTE SelectCount)//指定选择项,当批量使用单个箱子需要同时选中多种选项时使用该值 + SelectList = list() #(vector<tagCMUseItemsSelect> SelectList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0x23 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.ItemIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.UseCnt,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.ExData,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.SelectCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.SelectCount): + temSelectList = tagCMUseItemsSelect() + _pos = temSelectList.ReadData(_lpData, _pos) + self.SelectList.append(temSelectList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0x23 + self.ItemIndex = 0 + self.UseCnt = 0 + self.ExData = 0 + self.SelectCount = 0 + self.SelectList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 2 + length += 4 + length += 1 + for i in range(self.SelectCount): + length += self.SelectList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.ItemIndex) + data = CommFunc.WriteWORD(data, self.UseCnt) + data = CommFunc.WriteDWORD(data, self.ExData) + data = CommFunc.WriteBYTE(data, self.SelectCount) + for i in range(self.SelectCount): + data = CommFunc.WriteString(data, self.SelectList[i].GetLength(), self.SelectList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + ItemIndex:%d, + UseCnt:%d, + ExData:%d, + SelectCount:%d, + SelectList:%s + '''\ + %( + self.Head.OutputString(), self.ItemIndex, self.UseCnt, - self.ExData + self.ExData, + self.SelectCount, + "..." ) return DumpString m_NAtagCMUseItems=tagCMUseItems() -ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMUseItems.Cmd,m_NAtagCMUseItems.SubCmd))] = m_NAtagCMUseItems +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMUseItems.Head.Cmd,m_NAtagCMUseItems.Head.SubCmd))] = m_NAtagCMUseItems #------------------------------------------------------ diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py index d5a8d3c..7b83cd9 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py @@ -1534,20 +1534,37 @@ #// A3 23 使用物品 #tagCMUseItems # +#struct tagCMUseItemsSelect +#{ +# DWORD SelectID; //选择项ID +# WORD SelectCnt; //选择数 +#}; +# #struct tagCMUseItems #{ # tagHead Head; # BYTE ItemIndex; //物品在背包中索引 # WORD UseCnt; //使用个数,0表示全部使用 # DWORD ExData; //使用扩展值, 默认0, 选择物品宝箱时发送选择的物品ID +# BYTE SelectCount; //指定选择项,当批量使用单个箱子需要同时选中多种选项时使用该值 +# tagCMUseItemsSelect SelectList[SelectCount]; #}; def OnUseItems(index, packData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) itemIndex = packData.ItemIndex useCnt = packData.UseCnt exData = packData.ExData - GameWorld.DebugLog("OnUseItems itemIndex=%s,useCnt=%s,exData=%s" % (itemIndex, useCnt, exData), curPlayer.GetPlayerID()) - + selectDict = {} + if packData.SelectCount: + for selectInfo in packData.SelectList: + selectDict[selectInfo.SelectID] = selectInfo.SelectCnt + GameWorld.DebugLog("OnUseItems itemIndex=%s,useCnt=%s,exData=%s,selectDict=%s" % (itemIndex, useCnt, exData, selectDict), curPlayer.GetPlayerID()) + if selectDict: + exData = selectDict + GameWorld.DebugLog(" 使用多项选择,以多选为准! exData=%s" % exData) + elif exData: + GameWorld.DebugLog(" 使用单项选择,兼容旧模式! exData=%s" % exData) + backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) curItem = backPack.GetAt(itemIndex) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_Chests.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_Chests.py index 33234d4..a1365d3 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_Chests.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_Chests.py @@ -140,24 +140,33 @@ jobItemList = awardIpyData.GetJobItemList() # 选择物品 if awardIpyData.GetSelectItemDict(): - if not exData: - GameWorld.ErrLog("选择的物品错误, 需要指定一个选择物品ID!chestsItemID=%s,selectItemID=%s" % (chestsItemID, exData)) + if isinstance(exData, int): + selectDict = {exData:useCount} # 兼容旧的单选模式 + elif isinstance(exData, dict): + selectDict = exData + else: + GameWorld.ErrLog("选择的物品错误, 需要指定选择物品ID!chestsItemID=%s,exData=%s" % (chestsItemID, exData)) return - selectItemID = exData - - isSelectOK = False + GameWorld.DebugLog(" 自选项信息: %s" % selectDict) + selectCountTotal = 0 for cfgItemID, itemCount in awardIpyData.GetSelectItemDict().items(): # 支持按职业选择,前端无论发职业对应物品ID或者配置的物品ID均可获得 jobItemID = __GetChestsJobItem(chestsItemID, job, cfgItemID, jobItemList) if not jobItemID: return - if selectItemID == cfgItemID or selectItemID == jobItemID: - __AddAwardItem(awardItemDict, jobItemID, itemCount * useCount) - isSelectOK = True + if cfgItemID in selectDict: + selectCount = selectDict.pop(cfgItemID) + elif jobItemID in selectDict: + selectCount = selectDict.pop(jobItemID) + else: + continue + selectCountTotal += selectCount + GameWorld.DebugLog(" 可选自选项: cfgItemID=%s,jobItemID=%s,selectCount=%s" % (cfgItemID, jobItemID, selectCount)) + __AddAwardItem(awardItemDict, jobItemID, itemCount * selectCount) + if not selectDict: break - - if not isSelectOK: - GameWorld.ErrLog("选择的物品错误, 该宝箱没有该物品!chestsItemID=%s,selectItemID=%s" % (chestsItemID, selectItemID)) + if selectCountTotal != useCount: + GameWorld.ErrLog("选择的物品错误!chestsItemID=%s,selectCountTotal=%s != %s" % (chestsItemID, selectCountTotal, useCount)) return # 固定产出物品 -- Gitblit v1.8.0