xdh
2019-03-02 8df2bbe894731fb3691dfde36fa8e583bc8f5576
6307 【后端】【2.0】多套装备开发单(套装)
7个文件已修改
197 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStar.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetEquipPartStar.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;    //是否广播
};
//套装合成表
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二进制位存储
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:
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命令执行入口
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():
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 
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
#---------------------------------------------------------------------