10253 【越南】【砍树】【英文】聚魂 和 古宝获得物品展示(支持多选)
| | |
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | | 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
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | | 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
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | |
|
| | | #// 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)
|
| | |
| | | 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
|
| | |
|
| | | # 固定产出物品
|