From 149afba0633985377f570abfc51e70508db15e2e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 30 十月 2019 15:15:25 +0800
Subject: [PATCH] 8325 【主干】【后端】套装属性增加激活功能
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py | 80 ++++++++++++-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini | 6
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 64 ++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 67 +++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 7
PySysDB/PySysDBPY.h | 1
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 64 ++++++++++
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 67 +++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 2
9 files changed, 347 insertions(+), 11 deletions(-)
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index e2aeca1..c001a40 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -437,6 +437,7 @@
dict AttrInfo; //属性
DWORD SkillID; //技能ID
BYTE IsNotify; //是否广播
+ WORD ActivateIndex; //激活索引
};
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 4049f76..baaae1b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -9373,6 +9373,70 @@
#------------------------------------------------------
+# A5 C6 装备部位星级套装激活 #tagCMEquipPartSuiteActivate
+
+class tagCMEquipPartSuiteActivate(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("Cmd", c_ubyte),
+ ("SubCmd", c_ubyte),
+ ("ClassLV", c_ubyte), # 所属装备阶
+ ("SuiteID", c_ushort), # 套装ID
+ ("SuiteCount", c_ubyte), # 件数
+ ("Star", c_ubyte), # 星数
+ ]
+
+ def __init__(self):
+ self.Clear()
+ self.Cmd = 0xA5
+ self.SubCmd = 0xC6
+ return
+
+ def ReadData(self, stringData, _pos=0, _len=0):
+ self.Clear()
+ memmove(addressof(self), stringData[_pos:], self.GetLength())
+ return _pos + self.GetLength()
+
+ def Clear(self):
+ self.Cmd = 0xA5
+ self.SubCmd = 0xC6
+ self.ClassLV = 0
+ self.SuiteID = 0
+ self.SuiteCount = 0
+ self.Star = 0
+ return
+
+ def GetLength(self):
+ return sizeof(tagCMEquipPartSuiteActivate)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// A5 C6 装备部位星级套装激活 //tagCMEquipPartSuiteActivate:
+ Cmd:%s,
+ SubCmd:%s,
+ ClassLV:%d,
+ SuiteID:%d,
+ SuiteCount:%d,
+ Star:%d
+ '''\
+ %(
+ self.Cmd,
+ self.SubCmd,
+ self.ClassLV,
+ self.SuiteID,
+ self.SuiteCount,
+ self.Star
+ )
+ return DumpString
+
+
+m_NAtagCMEquipPartSuiteActivate=tagCMEquipPartSuiteActivate()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMEquipPartSuiteActivate.Cmd,m_NAtagCMEquipPartSuiteActivate.SubCmd))] = m_NAtagCMEquipPartSuiteActivate
+
+
+#------------------------------------------------------
# A5 48 兑换大师等级经验 #tagCMExchangeMasterEXP
class tagCMExchangeMasterEXP(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index b2eec9c..a406404 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -14104,6 +14104,73 @@
#------------------------------------------------------
+# A3 B2 装备部位星级套装激活信息 #tagMCEquipPartSuiteActivateInfo
+
+class tagMCEquipPartSuiteActivateInfo(Structure):
+ Head = tagHead()
+ Count = 0 #(BYTE Count)
+ SuiteActivateStateInfo = list() #(vector<DWORD> SuiteActivateStateInfo)//激活状态值列表,每个数按位存31个激活索引,每个位代表对应的激活索引是否已激活
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ self.Head.Cmd = 0xA3
+ self.Head.SubCmd = 0xB2
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ _pos = self.Head.ReadData(_lpData, _pos)
+ self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.Count):
+ value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+ self.SuiteActivateStateInfo.append(value)
+ return _pos
+
+ def Clear(self):
+ self.Head = tagHead()
+ self.Head.Clear()
+ self.Head.Cmd = 0xA3
+ self.Head.SubCmd = 0xB2
+ self.Count = 0
+ self.SuiteActivateStateInfo = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += self.Head.GetLength()
+ length += 1
+ length += 4 * self.Count
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+ data = CommFunc.WriteBYTE(data, self.Count)
+ for i in range(self.Count):
+ data = CommFunc.WriteDWORD(data, self.SuiteActivateStateInfo[i])
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Head:%s,
+ Count:%d,
+ SuiteActivateStateInfo:%s
+ '''\
+ %(
+ self.Head.OutputString(),
+ self.Count,
+ "..."
+ )
+ return DumpString
+
+
+m_NAtagMCEquipPartSuiteActivateInfo=tagMCEquipPartSuiteActivateInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCEquipPartSuiteActivateInfo.Head.Cmd,m_NAtagMCEquipPartSuiteActivateInfo.Head.SubCmd))] = m_NAtagMCEquipPartSuiteActivateInfo
+
+
+#------------------------------------------------------
# A3 BB 装备位洗练属性信息 #tagMCEquipPartXLAttrInfo
class tagMCEquipPartXLAttrValue(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 161abd6..77856d6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -1244,7 +1244,7 @@
Writer = xdh
Releaser = xdh
RegType = 0
-RegisterPackCount = 2
+RegisterPackCount = 3
PacketCMD_1=0xA5
PacketSubCMD_1=0x03
@@ -1254,6 +1254,10 @@
PacketSubCMD_2=0x18
PacketCallFunc_2=OnLingQiEquipBreak
+PacketCMD_3=0xA5
+PacketSubCMD_3=0xC6
+PacketCallFunc_3=OnEquipPartSuiteActivate
+
;仙盟抢boss
[FamilyRobBoss]
ScriptName = GameWorldLogic\FamilyRobBoss.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index e77ec82..38bd149 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3946,7 +3946,7 @@
#套装
Def_PDict_EquipPartSuiteLV = "EQPartSuiteLV_%s_%s" #部位套装等级 参数 部位、套装类型
-Def_PDict_EquipPartSuiteNotify = "EQPartSuiteNotify_%s" #部位套装提示记录 参数 标记
+Def_PDict_EquipPartSuiteActivate = "EQPartSuiteActivate_%s" #套装激活记录 参数 key编号
#神兽
Def_PDict_DogzFightState = "DogzFightState_%s" # 神兽助战状态,参数为key编号,按神兽ID二进制位存储
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 4049f76..baaae1b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -9373,6 +9373,70 @@
#------------------------------------------------------
+# A5 C6 装备部位星级套装激活 #tagCMEquipPartSuiteActivate
+
+class tagCMEquipPartSuiteActivate(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("Cmd", c_ubyte),
+ ("SubCmd", c_ubyte),
+ ("ClassLV", c_ubyte), # 所属装备阶
+ ("SuiteID", c_ushort), # 套装ID
+ ("SuiteCount", c_ubyte), # 件数
+ ("Star", c_ubyte), # 星数
+ ]
+
+ def __init__(self):
+ self.Clear()
+ self.Cmd = 0xA5
+ self.SubCmd = 0xC6
+ return
+
+ def ReadData(self, stringData, _pos=0, _len=0):
+ self.Clear()
+ memmove(addressof(self), stringData[_pos:], self.GetLength())
+ return _pos + self.GetLength()
+
+ def Clear(self):
+ self.Cmd = 0xA5
+ self.SubCmd = 0xC6
+ self.ClassLV = 0
+ self.SuiteID = 0
+ self.SuiteCount = 0
+ self.Star = 0
+ return
+
+ def GetLength(self):
+ return sizeof(tagCMEquipPartSuiteActivate)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// A5 C6 装备部位星级套装激活 //tagCMEquipPartSuiteActivate:
+ Cmd:%s,
+ SubCmd:%s,
+ ClassLV:%d,
+ SuiteID:%d,
+ SuiteCount:%d,
+ Star:%d
+ '''\
+ %(
+ self.Cmd,
+ self.SubCmd,
+ self.ClassLV,
+ self.SuiteID,
+ self.SuiteCount,
+ self.Star
+ )
+ return DumpString
+
+
+m_NAtagCMEquipPartSuiteActivate=tagCMEquipPartSuiteActivate()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMEquipPartSuiteActivate.Cmd,m_NAtagCMEquipPartSuiteActivate.SubCmd))] = m_NAtagCMEquipPartSuiteActivate
+
+
+#------------------------------------------------------
# A5 48 兑换大师等级经验 #tagCMExchangeMasterEXP
class tagCMExchangeMasterEXP(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index b2eec9c..a406404 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -14104,6 +14104,73 @@
#------------------------------------------------------
+# A3 B2 装备部位星级套装激活信息 #tagMCEquipPartSuiteActivateInfo
+
+class tagMCEquipPartSuiteActivateInfo(Structure):
+ Head = tagHead()
+ Count = 0 #(BYTE Count)
+ SuiteActivateStateInfo = list() #(vector<DWORD> SuiteActivateStateInfo)//激活状态值列表,每个数按位存31个激活索引,每个位代表对应的激活索引是否已激活
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ self.Head.Cmd = 0xA3
+ self.Head.SubCmd = 0xB2
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ _pos = self.Head.ReadData(_lpData, _pos)
+ self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.Count):
+ value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+ self.SuiteActivateStateInfo.append(value)
+ return _pos
+
+ def Clear(self):
+ self.Head = tagHead()
+ self.Head.Clear()
+ self.Head.Cmd = 0xA3
+ self.Head.SubCmd = 0xB2
+ self.Count = 0
+ self.SuiteActivateStateInfo = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += self.Head.GetLength()
+ length += 1
+ length += 4 * self.Count
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+ data = CommFunc.WriteBYTE(data, self.Count)
+ for i in range(self.Count):
+ data = CommFunc.WriteDWORD(data, self.SuiteActivateStateInfo[i])
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Head:%s,
+ Count:%d,
+ SuiteActivateStateInfo:%s
+ '''\
+ %(
+ self.Head.OutputString(),
+ self.Count,
+ "..."
+ )
+ return DumpString
+
+
+m_NAtagMCEquipPartSuiteActivateInfo=tagMCEquipPartSuiteActivateInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCEquipPartSuiteActivateInfo.Head.Cmd,m_NAtagMCEquipPartSuiteActivateInfo.Head.SubCmd))] = m_NAtagMCEquipPartSuiteActivateInfo
+
+
+#------------------------------------------------------
# A3 BB 装备位洗练属性信息 #tagMCEquipPartXLAttrInfo
class tagMCEquipPartXLAttrValue(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 07ff968..3db1439 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -366,6 +366,7 @@
("dict", "AttrInfo", 0),
("DWORD", "SkillID", 0),
("BYTE", "IsNotify", 0),
+ ("WORD", "ActivateIndex", 0),
),
"WingRefineAttr":(
@@ -2233,7 +2234,8 @@
self.Star = 0
self.AttrInfo = {}
self.SkillID = 0
- self.IsNotify = 0
+ self.IsNotify = 0
+ self.ActivateIndex = 0
return
def GetSuiteID(self): return self.SuiteID # 套装ID
@@ -2241,7 +2243,8 @@
def GetStar(self): return self.Star # 星数
def GetAttrInfo(self): return self.AttrInfo # 属性
def GetSkillID(self): return self.SkillID # 技能ID
- def GetIsNotify(self): return self.IsNotify # 是否广播
+ def GetIsNotify(self): return self.IsNotify # 是否广播
+ def GetActivateIndex(self): return self.ActivateIndex # 激活索引
# 羽翼精炼属性表
class IPY_WingRefineAttr():
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
index 2d29c31..0556e07 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -324,7 +324,8 @@
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalEquipWashLV, totalWashLV)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalStoneLV, totalStoneLV)
GameWorld.DebugLog("登录更新装备相关值汇总: orangeEquipCount=%s,totalStar=%s,totalPlusLV=%s,totalEvolveLV=%s,totalWashLV=%s,totalStoneLV=%s"
- % (orangeEquipCount, totalStar, totalPlusLV, totalEvolveLV, totalWashLV, totalStoneLV))
+ % (orangeEquipCount, totalStar, totalPlusLV, totalEvolveLV, totalWashLV, totalStoneLV))
+ Sync_EquipPartSuiteActivateInfo(curPlayer)
return
## 刷新所有装备对人物属性的改变
@@ -1039,7 +1040,10 @@
suiteCnt = ipyData.GetSuiteCnt()
needStar = ipyData.GetStar()
skillID = ipyData.GetSkillID()
- if [1 if star >= needStar else 0 for star in starList].count(1) >= suiteCnt:
+ activateIndex = ipyData.GetActivateIndex()
+ isActivate = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteActivate, activateIndex)
+ #GameWorld.DebugLog("suiteID=%s,suiteCnt=%s,needStar=%s,isActivate=%s" % (suiteID, suiteCnt, needStar, isActivate))
+ if isActivate and [1 if star >= needStar else 0 for star in starList].count(1) >= suiteCnt:
#GameWorld.DebugLog(" 套装: suiteID=%s,suiteCnt=%s,needStar=%s" % (suiteID, suiteCnt, needStar))
for attrID, attrValue in ipyData.GetAttrInfo().items():
PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListSuit)
@@ -1047,11 +1051,11 @@
#技能
if skillID and not skillManager.FindSkillBySkillTypeID(skillID):
learnSkillList.append(skillID)
- #广播
- notifyMark = ipyData.GetIsNotify()
- if notifyMark and not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark):
- PlayerControl.WorldNotify(0, 'AllStarLevelUp' if needStar else 'AllStarLevelUp2', [playerName, suiteID, suiteCnt, needStar])
- GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark, 1)
+# #广播,改为激活时广播即可
+# notifyMark = ipyData.GetIsNotify()
+# if notifyMark and not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark):
+# PlayerControl.WorldNotify(0, 'AllStarLevelUp' if needStar else 'AllStarLevelUp2', [playerName, suiteID, suiteCnt, needStar])
+# GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark, 1)
else:
if skillID and skillManager.FindSkillBySkillTypeID(skillID):
@@ -1071,6 +1075,68 @@
PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer)
return
+#// A5 C6 装备部位星级套装激活 #tagCMEquipPartSuiteActivate
+#
+#struct tagCMEquipPartSuiteActivate
+#{
+# tagHead Head;
+# BYTE ClassLV; // 所属装备阶
+# WORD SuiteID; // 套装ID
+# BYTE SuiteCount; // 件数
+# BYTE Star; // 星数
+#};
+def OnEquipPartSuiteActivate(index, clientData, tick):
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ classLV = clientData.ClassLV
+ suiteID = clientData.SuiteID
+ suiteCount = clientData.SuiteCount
+ star = clientData.Star
+ ipyDataList = IpyGameDataPY.GetIpyGameDataList('EquipSuitAttr', suiteID)
+ if not ipyDataList:
+ return
+
+ actIpyData = None
+ for ipyData in ipyDataList:
+ needCount = ipyData.GetSuiteCnt()
+ needStar = ipyData.GetStar()
+ if suiteCount == needCount and star == needStar:
+ actIpyData = ipyData
+ break
+
+ if not actIpyData:
+ return
+ activateIndex = actIpyData.GetActivateIndex()
+ # 这里就不判断是否满足件数、星数条件了,算属性的时候本身也是条件之一,是否激活只是附加条件,这里只处理激活状态变更,能否激活前端判断即可
+ isActivate = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteActivate, activateIndex)
+ if isActivate:
+ return
+ GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteActivate, activateIndex, 1)
+ Sync_EquipPartSuiteActivateInfo(curPlayer)
+
+ #广播
+ notifyMark = actIpyData.GetIsNotify()
+ if notifyMark:
+ PlayerControl.WorldNotify(0, 'AllStarLevelUp' if needStar else 'AllStarLevelUp2', [curPlayer.GetPlayerName(), suiteID, suiteCount, star])
+
+ RefreshPlayerEquipAttribute(curPlayer, classLV)
+ #刷新所有属性
+ playControl = PlayerControl.PlayerControl(curPlayer)
+ playControl.RefreshPlayerAttrState()
+ return
+
+def Sync_EquipPartSuiteActivateInfo(curPlayer):
+ ## 同步装备位星级套装激活状态信息
+ keyCount = 10
+ activateStateList = []
+ for i in xrange(keyCount):
+ activateStateList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartSuiteActivate % i))
+ if activateStateList.count(0) == keyCount:
+ return
+ activateInfo = ChPyNetSendPack.tagMCEquipPartSuiteActivateInfo()
+ activateInfo.SuiteActivateStateInfo = activateStateList
+ activateInfo.Count = len(activateInfo.SuiteActivateStateInfo)
+ NetPackCommon.SendFakePack(curPlayer, activateInfo)
+ return
##全身橙色装备数量触发相关(包含橙色品质以上的装备数量)
def OnOrangeQualityCntChange(curPlayer, orangeQualityCnt):
--
Gitblit v1.8.0