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