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