From a00b22d818207e803383735526c1e2344ad46b87 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期一, 03 十二月 2018 19:44:54 +0800
Subject: [PATCH] 2546 【1.3】【1.3.100】自动分解装备增加防范
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 45 ++++++++++----
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEquipDecompose.py | 30 ++++++---
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 45 ++++++++++----
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py | 5 +
4 files changed, 84 insertions(+), 41 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 6b0bc08..e48c4cf 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -5494,8 +5494,10 @@
class tagCMEquipDecompose(Structure):
Head = tagHead()
- IndexCount = 0 #(BYTE IndexCount)//材料所在背包索引的数量
- IndexList = list() #(vector<BYTE> IndexList)//材料所在背包索引列表
+ Count = 0 #(BYTE Count)//材料所在背包索引的数量
+ IndexList = list() #(vector<WORD> IndexList)//材料所在背包索引列表
+ ItemIDList = list() #(vector<DWORD> ItemIDList)//材料所在背包物品ID列表
+ IsAuto = 0 #(BYTE IsAuto)//是否自动分解
data = None
def __init__(self):
@@ -5507,10 +5509,14 @@
def ReadData(self, _lpData, _pos=0, _Len=0):
self.Clear()
_pos = self.Head.ReadData(_lpData, _pos)
- self.IndexCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- for i in range(self.IndexCount):
- value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
+ self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.Count):
+ value,_pos=CommFunc.ReadWORD(_lpData,_pos)
self.IndexList.append(value)
+ for i in range(self.Count):
+ value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+ self.ItemIDList.append(value)
+ self.IsAuto,_pos = CommFunc.ReadBYTE(_lpData, _pos)
return _pos
def Clear(self):
@@ -5518,36 +5524,47 @@
self.Head.Clear()
self.Head.Cmd = 0xA3
self.Head.SubCmd = 0x2C
- self.IndexCount = 0
+ self.Count = 0
self.IndexList = list()
+ self.ItemIDList = list()
+ self.IsAuto = 0
return
def GetLength(self):
length = 0
length += self.Head.GetLength()
length += 1
- length += 1 * self.IndexCount
+ length += 2 * self.Count
+ length += 4 * self.Count
+ length += 1
return length
def GetBuffer(self):
data = ''
data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
- data = CommFunc.WriteBYTE(data, self.IndexCount)
- for i in range(self.IndexCount):
- data = CommFunc.WriteBYTE(data, self.IndexList[i])
+ data = CommFunc.WriteBYTE(data, self.Count)
+ for i in range(self.Count):
+ data = CommFunc.WriteWORD(data, self.IndexList[i])
+ for i in range(self.Count):
+ data = CommFunc.WriteDWORD(data, self.ItemIDList[i])
+ data = CommFunc.WriteBYTE(data, self.IsAuto)
return data
def OutputString(self):
DumpString = '''
Head:%s,
- IndexCount:%d,
- IndexList:%s
+ Count:%d,
+ IndexList:%s,
+ ItemIDList:%s,
+ IsAuto:%d
'''\
%(
self.Head.OutputString(),
- self.IndexCount,
- "..."
+ self.Count,
+ "...",
+ "...",
+ self.IsAuto
)
return DumpString
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 6b0bc08..e48c4cf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -5494,8 +5494,10 @@
class tagCMEquipDecompose(Structure):
Head = tagHead()
- IndexCount = 0 #(BYTE IndexCount)//材料所在背包索引的数量
- IndexList = list() #(vector<BYTE> IndexList)//材料所在背包索引列表
+ Count = 0 #(BYTE Count)//材料所在背包索引的数量
+ IndexList = list() #(vector<WORD> IndexList)//材料所在背包索引列表
+ ItemIDList = list() #(vector<DWORD> ItemIDList)//材料所在背包物品ID列表
+ IsAuto = 0 #(BYTE IsAuto)//是否自动分解
data = None
def __init__(self):
@@ -5507,10 +5509,14 @@
def ReadData(self, _lpData, _pos=0, _Len=0):
self.Clear()
_pos = self.Head.ReadData(_lpData, _pos)
- self.IndexCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- for i in range(self.IndexCount):
- value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
+ self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.Count):
+ value,_pos=CommFunc.ReadWORD(_lpData,_pos)
self.IndexList.append(value)
+ for i in range(self.Count):
+ value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+ self.ItemIDList.append(value)
+ self.IsAuto,_pos = CommFunc.ReadBYTE(_lpData, _pos)
return _pos
def Clear(self):
@@ -5518,36 +5524,47 @@
self.Head.Clear()
self.Head.Cmd = 0xA3
self.Head.SubCmd = 0x2C
- self.IndexCount = 0
+ self.Count = 0
self.IndexList = list()
+ self.ItemIDList = list()
+ self.IsAuto = 0
return
def GetLength(self):
length = 0
length += self.Head.GetLength()
length += 1
- length += 1 * self.IndexCount
+ length += 2 * self.Count
+ length += 4 * self.Count
+ length += 1
return length
def GetBuffer(self):
data = ''
data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
- data = CommFunc.WriteBYTE(data, self.IndexCount)
- for i in range(self.IndexCount):
- data = CommFunc.WriteBYTE(data, self.IndexList[i])
+ data = CommFunc.WriteBYTE(data, self.Count)
+ for i in range(self.Count):
+ data = CommFunc.WriteWORD(data, self.IndexList[i])
+ for i in range(self.Count):
+ data = CommFunc.WriteDWORD(data, self.ItemIDList[i])
+ data = CommFunc.WriteBYTE(data, self.IsAuto)
return data
def OutputString(self):
DumpString = '''
Head:%s,
- IndexCount:%d,
- IndexList:%s
+ Count:%d,
+ IndexList:%s,
+ ItemIDList:%s,
+ IsAuto:%d
'''\
%(
self.Head.OutputString(),
- self.IndexCount,
- "..."
+ self.Count,
+ "...",
+ "...",
+ self.IsAuto
)
return DumpString
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEquipDecompose.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEquipDecompose.py
index 48c4f7f..65980d5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEquipDecompose.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEquipDecompose.py
@@ -51,10 +51,11 @@
#struct tagCMEquipDecompose
#{
# tagHead Head;
-# BYTE IndexCount; //材料所在背包索引的数量
-# BYTE IndexList[IndexCount]; //材料所在背包索引列表
+# BYTE Count; //材料所在背包索引的数量
+# WORD IndexList[Count]; //材料所在背包索引列表
+# DWORD ItemIDList[Count]; //材料所在背包物品ID列表
+# BYTE IsAuto; //是否自动分解
#};
-
## 玩家分解装备封包 A5 08
# @param playerIndex 玩家索引
# @param clientData 客户端封包
@@ -62,15 +63,19 @@
# @return None
def OnDoEquipDecompose(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-
+ if not clientData.Count:
+ return
eatIndexList = clientData.IndexList
-
- EatItems(curPlayer, eatIndexList)
+ eatItemIDList = clientData.ItemIDList
+ isAuto = clientData.IsAuto
+ EatItems(curPlayer, eatIndexList, eatItemIDList, isAuto)
return
# 吞噬物品, 返回被吞数量
-def EatItems(curPlayer, eatIndexList):
- drDelItemList, totalAddExp, delAllCnt = __GetCanEatItemInfo(curPlayer, eatIndexList)
+def EatItems(curPlayer, eatIndexList, eatItemIDList, isAuto=False):
+ if len(eatIndexList) != len(eatItemIDList):
+ return 0, 0
+ drDelItemList, totalAddExp, delAllCnt = __GetCanEatItemInfo(curPlayer, eatIndexList, eatItemIDList)
if not totalAddExp:
GameWorld.DebugLog(" 装备吸收 没有可吞噬物品!")
return 0, 0
@@ -116,7 +121,7 @@
Sync_EDLVInfo(curPlayer, jsonItemList)
# 流向
saveDataDict = {"ExpBefore":Exp, "AddTotalExp":reduceTotalExp, "ExpAfter":updExp,
- "DelItemList(ItemID,delCnt,baseExp,addExp)":drDelItemList}
+ "DelItemList(ItemID,delCnt,baseExp,addExp)":drDelItemList, 'isAuto':isAuto}
DataRecordPack.DR_ClassUpSystem(curPlayer, "EquipDecomposeUp", updLV, saveDataDict)
#EventReport.WriteEvent__lv(curPlayer, LV, updLV, Exp, updExp)
@@ -125,19 +130,22 @@
##获取可以吞噬的物品信息
# @param curPlayer: 玩家实例
# @return [可吞噬的物品列表], 最大可提供的经验
-def __GetCanEatItemInfo(curPlayer, expIndexList):
+def __GetCanEatItemInfo(curPlayer, expIndexList, eatItemIDList):
eatItemList = []
totalAddExp = 0
allitemCnt = 0
petEatItemAddExpPer = PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_EatItem)
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
- for index in expIndexList:
+ for i, index in enumerate(expIndexList):
eatItem = itemPack.GetAt(index)
if not eatItem or eatItem.IsEmpty():
continue
eatItemID = eatItem.GetItemTypeID()
+ if eatItemIDList[i] != eatItemID:
+ GameWorld.ErrLog(' 装备分解客户端发的物品索引与实际物品ID不对应 index=%s,eatItemID=%s,wantEatItemID'%(index, eatItemID, eatItemIDList[i]))
+ continue
if eatItem.GetType() == ChConfig.Def_ItemType_EquipDecomposeExp:
curEff = eatItem.GetEffectByIndex(0)
baseExp = curEff.GetEffectValue(0)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py
index 0dccd66..41b58dd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTJG.py
@@ -544,6 +544,7 @@
#GameWorld.DebugLog("equipScores----%s"%equipScores)
eatIndexList = []
+ eatItemIDList = []
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
for i in range(0, itemPack.GetCount()):
curItem = itemPack.GetAt(i)
@@ -566,9 +567,9 @@
continue
eatIndexList.append(i)
-
+ eatItemIDList.append(curItem.GetItemTypeID())
#GameWorld.DebugLog("eatIndexList-----------%s"%len(eatIndexList))
- eatCount, giveCnt = PlayerEquipDecompose.EatItems(curPlayer, eatIndexList)
+ eatCount, giveCnt = PlayerEquipDecompose.EatItems(curPlayer, eatIndexList, eatItemIDList)
NoteEatEquip(curPlayer, eatCount, giveCnt)
CheckPackFull(curPlayer)
--
Gitblit v1.8.0