From 8df2bbe894731fb3691dfde36fa8e583bc8f5576 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期六, 02 三月 2019 14:39:49 +0800
Subject: [PATCH] 6307 【后端】【2.0】多套装备开发单(套装)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py                     |   98 +++++++++++++----------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                    |   57 ++++---------
 PySysDB/PySysDBPY.h                                                                                     |   19 +---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartStar.py     |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py               |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                         |   15 ---
 7 files changed, 86 insertions(+), 111 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index fb54306..f75fb8b 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -374,19 +374,12 @@
 
 struct tagEquipSuitAttr
 {
-	BYTE		_GroupType;	//套装组合类型
-	BYTE		_SuiteType;	//套装类型
-	WORD		_SuiteLV;	//套装等级
-	BYTE		_Job;	//职业
-	BYTE		Count1;	//阶段1所需数量
-	list		AttrType1;	//阶段1属性类型
-	list		AttrValue1;	//阶段1属性值
-	BYTE		Count2;	//阶段2所需数量
-	list		AttrType2;	//阶段2属性类型
-	list		AttrValue2;	//阶段2属性值
-	BYTE		Count3;	//阶段2所需数量
-	list		AttrType3;	//阶段2属性类型
-	list		AttrValue3;	//阶段2属性值
+	WORD		_SuiteID;	//套装ID
+	BYTE		SuiteCnt;	//套装件数
+	BYTE		Star;	//星数
+	dict		AttrInfo;	//属性
+	DWORD		SkillID;	//技能ID
+	BYTE		IsNotify;	//是否广播
 };
 
 //套装合成表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index f768f64..cb93207 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -2430,19 +2430,10 @@
     ShareDefine.retWeapon2Skin,  #22 时装副手
                            ]
 
-# 需要广播外观的装备部位
-Def_SyncEquipStateByIndex = [                            
-    ShareDefine.retWeapon,      #1 主手
-    ShareDefine.retWeapon2,     #2 副手
-    ShareDefine.retHat,         #3 帽子
-    ShareDefine.retClothes,     #4 衣服
-    ShareDefine.retBelt,        #5 腰带
-    ShareDefine.retTrousers,    #6 裤子
-    ShareDefine.retShoes,       #7 鞋子
-    ShareDefine.retGlove,           #8 手套
+# 需要广播外观的装备部位(除了境界装备3部位)
+Def_SyncEquipStateByIndex = [
     ShareDefine.retWing,        #11 翅膀
     ShareDefine.retGuard1,    #14 守护1
-    ShareDefine.retGuard2,    #15 守护2
     ShareDefine.retHorse,        #19 坐骑
                              ]
 #套装装备部位列表
@@ -4006,7 +3997,7 @@
 
 #套装
 Def_PDict_EquipPartSuiteLV = "EQPartSuiteLV_%s_%s" #部位套装等级 参数 部位、套装类型
-Def_PDict_EquipPartSuiteNotify = "EQPartSuiteNotify_%s_%s_%s" #部位套装提示记录 参数 组合类型、套装类型、X件
+Def_PDict_EquipPartSuiteNotify = "EQPartSuiteNotify_%s" #部位套装提示记录 参数 标记
 
 #神兽
 Def_PDict_DogzFightState = "DogzFightState_%s" # 神兽助战状态,参数为key编号,按神兽ID二进制位存储
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py
index 03e9d0e..993d160 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py
@@ -79,7 +79,8 @@
 
     # 升星处理
     result = DoLogic_EquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, clientData)
-    
+    if result == ChConfig.Def_ComposeState_None:
+        return
     updPartStar = ChEquip.GetEquipPartStar(curPlayer, equipPackIndex)
     GameWorld.DebugLog("   装备升星 equipPackIndex=%s result=%s,curPartStar=%s,updPartStar=%s" % (equipPackIndex, result, curPartStar, updPartStar), playerID)
     if result == ChConfig.Def_ComposeState_Sucess:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartStar.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartStar.py
index b44de0e..3a69ff9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartStar.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartStar.py
@@ -14,13 +14,12 @@
 # 详细描述: 设置装备部位公共星数
 #
 #---------------------------------------------------------------------
-import IpyGameDataPY
 """Version = 2019-3-2 17:00"""
 #---------------------------------------------------------------------
 import PlayerControl
 import ChEquip
 import GameWorld
-
+import IpyGameDataPY
 #---------------------------------------------------------------------
 #逻辑实现
 ## GM命令执行入口
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index dcbe4b3..c794290 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -316,19 +316,12 @@
                         ),
 
                 "EquipSuitAttr":(
-                        ("BYTE", "GroupType", 1),
-                        ("BYTE", "SuiteType", 1),
-                        ("WORD", "SuiteLV", 1),
-                        ("BYTE", "Job", 1),
-                        ("BYTE", "Count1", 0),
-                        ("list", "AttrType1", 0),
-                        ("list", "AttrValue1", 0),
-                        ("BYTE", "Count2", 0),
-                        ("list", "AttrType2", 0),
-                        ("list", "AttrValue2", 0),
-                        ("BYTE", "Count3", 0),
-                        ("list", "AttrType3", 0),
-                        ("list", "AttrValue3", 0),
+                        ("WORD", "SuiteID", 1),
+                        ("BYTE", "SuiteCnt", 0),
+                        ("BYTE", "Star", 0),
+                        ("dict", "AttrInfo", 0),
+                        ("DWORD", "SkillID", 0),
+                        ("BYTE", "IsNotify", 0),
                         ),
 
                 "EquipSuitCompound":(
@@ -1989,34 +1982,20 @@
 class IPY_EquipSuitAttr():
     
     def __init__(self):
-        self.GroupType = 0
-        self.SuiteType = 0
-        self.SuiteLV = 0
-        self.Job = 0
-        self.Count1 = 0
-        self.AttrType1 = []
-        self.AttrValue1 = []
-        self.Count2 = 0
-        self.AttrType2 = []
-        self.AttrValue2 = []
-        self.Count3 = 0
-        self.AttrType3 = []
-        self.AttrValue3 = []
+        self.SuiteID = 0
+        self.SuiteCnt = 0
+        self.Star = 0
+        self.AttrInfo = {}
+        self.SkillID = 0
+        self.IsNotify = 0
         return
         
-    def GetGroupType(self): return self.GroupType # 套装组合类型
-    def GetSuiteType(self): return self.SuiteType # 套装类型
-    def GetSuiteLV(self): return self.SuiteLV # 套装等级
-    def GetJob(self): return self.Job # 职业
-    def GetCount1(self): return self.Count1 # 阶段1所需数量
-    def GetAttrType1(self): return self.AttrType1 # 阶段1属性类型
-    def GetAttrValue1(self): return self.AttrValue1 # 阶段1属性值
-    def GetCount2(self): return self.Count2 # 阶段2所需数量
-    def GetAttrType2(self): return self.AttrType2 # 阶段2属性类型
-    def GetAttrValue2(self): return self.AttrValue2 # 阶段2属性值
-    def GetCount3(self): return self.Count3 # 阶段2所需数量
-    def GetAttrType3(self): return self.AttrType3 # 阶段2属性类型
-    def GetAttrValue3(self): return self.AttrValue3 # 阶段2属性值
+    def GetSuiteID(self): return self.SuiteID # 套装ID
+    def GetSuiteCnt(self): return self.SuiteCnt # 套装件数
+    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 # 是否广播
 
 # 套装合成表
 class IPY_EquipSuitCompound():
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 3fdec12..ae1eec5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -35,6 +35,8 @@
 import PlayerWing
 import Operate_EquipStone
 import Operate_EquipSuitCompose
+import PassiveBuffEffMng
+import SkillCommon
 import PlayerMagicWeapon
 import time
 import json
@@ -119,7 +121,7 @@
     if curEquip.GetUserAttr(ShareDefine.Def_IudetCreateTime) == 0:
         curEquip.SetUserAttr(ShareDefine.Def_IudetCreateTime, int(time.time()))
     #---换装成功---
-    if equipPackIndex in PlayerControl.GetFaceEquipIndexList(curPlayer):
+    if equipPackIndex in PlayerControl.GetFaceEquipIndexList(curPlayer) or equipPlace in ChConfig.Def_SyncEquipStateByIndex:
         #通知客户端交换物品
         curPlayer.ChangeEquip(changeItemID, equipPackIndex, changeItemStarLV, changeItemHoleCnt, changeItemStoneCnt, changeItemUseData)
         
@@ -391,7 +393,7 @@
     playControl = PlayerControl.PlayerControl(curPlayer)
     playControl.RefreshPlayerAttrState()
     
-    if equipPlace in ChConfig.Def_SyncEquipStateByIndex:
+    if equipPackIndex in PlayerControl.GetFaceEquipIndexList(curPlayer) or equipPlace in ChConfig.Def_SyncEquipStateByIndex:
         curPlayer.Sync_UnEquipItem(equipID, equipPackIndex)
     return
 
@@ -455,7 +457,7 @@
     #allAttrListEquip = [{} for _ in range(4)]  # 装备其他
     #allAttrListPlusBase = [{} for _ in range(4)]  # 基础强化属性
     allAttrListStone = [{} for _ in range(4)]  # 宝石属性
-    #allAttrListSuit = [{} for _ in range(4)]  # 套装属性
+    allAttrListSuit = [{} for _ in range(4)]  # 套装属性
     #allAttrListWash = [{} for _ in range(4)]  # 洗练属性
     #allAttrListOutOfPrintEquip = [{} for _ in range(4)]  # 绝版装备属性 需在等级变化独立计算
     
@@ -464,7 +466,7 @@
     equipPartStarIndexList = ChConfig.Pack_EquipPart_CanPlusStar.get(packType, [])
     #maxSuiteType = IpyGameDataPY.GetFuncCfg('EquipSuitColorStar', 2)  #最大套装类型
     #equipPlaceList = []  # 有穿戴装备的装备位列表
-    #suitCntDict = {}  #套装数量字典
+    suitCntDict = {}  #套装数量字典
     #legendAttrDict = {}  #所有传奇属性
     equipScoreTotal = 0  #为解决装备评分、战力不一致的情况,装备战力改为由评分作为参数计算战力
     
@@ -475,7 +477,7 @@
             continue
         equipIndex = ipyData.GetGridIndex()
         curEquip = playerEquip.GetAt(equipIndex)
-        if curEquip.IsEmpty():
+        if not curEquip or curEquip.IsEmpty():
             continue
             
         if not ItemCommon.CheckItemCanUseByExpireTime(curEquip):
@@ -523,6 +525,12 @@
         CalcEquipStarAttr(curPlayer, classlv, equipPlace, equipPartStar, allAttrListStar)
         #计算装备宝石加成
         CalcEquipStone_Effect(curPlayer, equipIndex, allAttrListStone)
+        #套装计数
+        suiteID = curEquip.GetSuiteID()
+        if suiteID:
+            if suiteID not in suitCntDict:
+                suitCntDict[suiteID] = []
+            suitCntDict[suiteID].append(equipPartStar)
         
         #物品强化属性,佩饰强化不同要区分
 #        if equipIndex in equipPartStarIndexList:
@@ -539,7 +547,7 @@
     #洗练套装属性
     #Operate_EquipWash.CalcAttr_EquipWashSpec(curPlayer, equipPlaceList, allAttrListWash)
     #套装属性
-    #CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListSuit)
+    CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListSuit)
     #GameWorld.DebugLog("所有传奇属性: %s" % legendAttrDict)
     #保存计算值
     #PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Stone, allAttrListStone)
@@ -730,44 +738,48 @@
 ## 装备套装属性计算
 #  @param curPlayer 当前玩家
 #  @return None
-def CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListEquip):
-    Def_EquipSuitMaxCount = 3  #套装最大阶段
-    myjob = curPlayer.GetJob()
-    name = curPlayer.GetName()
-    
-    for suiteKey, cnt in suitCntDict.items():
-        groupType, suiteType, suiteLV = suiteKey.split('_')
-        suiteLV = int(suiteLV)
-        job = 0 if groupType == ChConfig.EquipGroupType_Relics else myjob  #仙器组合默认职业0
-        ipyData = IpyGameDataPY.GetIpyGameData('EquipSuitAttr', int(groupType), int(suiteType), int(suiteLV), job)
-        if not ipyData:
+def CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListSuit):
+    if not suitCntDict:
+        return
+    GameWorld.DebugLog('    suitCntDict=%s'%suitCntDict)
+    learnSkillList = []
+    delSkillID = []
+    skillManager = curPlayer.GetSkillManager()
+    playerName = curPlayer.GetName()
+    for suiteID, starList in suitCntDict.items():
+        ipyDataList = IpyGameDataPY.GetIpyGameDataList('EquipSuitAttr', suiteID)
+        if not ipyDataList:
             continue
-        
-        for i in range(1, Def_EquipSuitMaxCount + 1):
-            countKeyName = 'GetCount%d' % i
-            attrTypeKeyName = 'GetAttrType%d' % i
-            attrValueKeyName = 'GetAttrValue%d' % i
-            needCnt = getattr(ipyData, countKeyName)()
-            if cnt >= needCnt:
-                attrTypeList = getattr(ipyData, attrTypeKeyName)()
-                attrValueList = getattr(ipyData, attrValueKeyName)()
-                for j, attrID in enumerate(attrTypeList):
-                    value = attrValueList[j]
-                    PlayerControl.CalcAttrDict_Type(attrID, value, allAttrListEquip)
-                    
-        #套装激活提示(只提示1次)
-        paramList = [name, cnt, suiteLV, groupType, suiteType]
-        notifyRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartSuiteNotify % (groupType, suiteType, cnt))
-        if not notifyRecord & pow(2, suiteLV):
-            if groupType == ChConfig.EquipGroupType_Armor:
-                if cnt >= 5:
-                    PlayerControl.WorldNotify(0, 'EquipSuit5', paramList)
-                    notifyRecord |= pow(2, suiteLV)
+        for ipyData in ipyDataList:
+            suiteCnt = ipyData.GetSuiteCnt()
+            star = ipyData.GetStar()
+            skillID = ipyData.GetSkillID()
+            if starList.count(star) >= suiteCnt:
+                for attrID, attrValue in ipyData.GetAttrInfo().items():
+                    PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListSuit)
+                #技能
+                if skillID and not skillManager.FindSkillBySkillTypeID(skillID):
+                    learnSkillList.append(skillID)
             else:
-                PlayerControl.WorldNotify(0, 'EquipSuit5', paramList)
-                notifyRecord |= pow(2, suiteLV)
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify % (groupType, suiteType, cnt), notifyRecord)
-    
+                if skillID and skillManager.FindSkillBySkillTypeID(skillID):
+                    delSkillID.append(skillID)
+                    skillManager.DeleteSkillBySkillTypeID(skillID)
+            notifyMark = ipyData.GetIsNotify()
+            if notifyMark and not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark):
+                PlayerControl.WorldNotify(0, 'AllStarLevelUp', [playerName, suiteID, suiteCnt, star])
+                GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark, 1)
+                
+            
+    for skillID in learnSkillList:
+        GameWorld.DebugLog('    激活套装技能 skillResID=%s' % (skillID))
+        skillData = GameWorld.GetGameData().FindSkillByType(skillID, 1)
+        if not skillData:
+            continue
+        skillManager.LVUpSkillBySkillTypeID(skillID)   
+        PlayerControl.PlayerControl(curPlayer).RefreshSkillFightPowerEx(skillID, 0)
+    if learnSkillList or delSkillID:
+        # 重刷被动技能
+        PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer)    
     return
 
 
@@ -1117,7 +1129,7 @@
     if index == None:
         equipMaxClasslv = IpyGameDataPY.GetFuncCfg('EquipMaxClasslv')
         for equipPlace in ChConfig.Pack_EquipPart_CanPlusStar.get(IPY_GameWorld.rptEquip, []):
-            for classlv in xrange(equipMaxClasslv):
+            for classlv in xrange(1, equipMaxClasslv+1):
                 ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classlv, equipPlace)
                 if not ipyData:
                     continue 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
index 8debe53..be27616 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -1146,7 +1146,7 @@
             PlayerGoldGift.FirstGoldTryItemOutTime(curPlayer)
             
     # 广播卸装
-    if equipPlace in ChConfig.Def_SyncEquipStateByIndex:
+    if equipIndex in PlayerControl.GetFaceEquipIndexList(curPlayer) or equipPlace in ChConfig.Def_SyncEquipStateByIndex:
         curPlayer.Sync_UnEquipItem(equipID, equipIndex)
     return True
 #---------------------------------------------------------------------

--
Gitblit v1.8.0