Add: 1886 【后端】神兽功能及神兽装备相关;2615 【后端】神兽——强化功能;
15个文件已修改
1个文件已添加
1569 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py 514 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -126,6 +126,27 @@
    list        AttrValue;    //属性值
};
//神兽表
struct tagDogz
{
    BYTE        _DogzID;    //神兽ID
    list        BaseAttrTypes;    //基础属性类型列表
    list        BaseAttrValues;    //基础属性值列表
    list        HelpBattleSkills;    //助战技能ID列表
    list        EquipPlaceColorList;    //穿戴装备颜色限制
};
//神兽强化表
struct tagDogzEquipPlus
{
    BYTE        _EquipPlace;    //装备位
    BYTE        _PlusLV;    //强化等级
    list        PlusAttrTypes;    //强化属性类型列表
    list        PlusAttrValues;    //强化属性值列表
    DWORD        PlusLVUPTotalExp;    //升级所需累计熟练度总值
};
//符印表
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -7717,6 +7717,303 @@
#------------------------------------------------------
# A5 C2 神兽变更助战状态 #tagCMDogzBattleStateChange
class  tagCMDogzBattleStateChange(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("DogzID", c_ubyte),    # 神兽ID
                  ("BatteState", c_ubyte),    #助战状态,0-召回,1-助战
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0xC2
        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 = 0xC2
        self.DogzID = 0
        self.BatteState = 0
        return
    def GetLength(self):
        return sizeof(tagCMDogzBattleStateChange)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 C2 神兽变更助战状态 //tagCMDogzBattleStateChange:
                                Cmd:%s,
                                SubCmd:%s,
                                DogzID:%d,
                                BatteState:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.DogzID,
                                self.BatteState
                                )
        return DumpString
m_NAtagCMDogzBattleStateChange=tagCMDogzBattleStateChange()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMDogzBattleStateChange.Cmd,m_NAtagCMDogzBattleStateChange.SubCmd))] = m_NAtagCMDogzBattleStateChange
#------------------------------------------------------
# A5 C3 神兽购买助战位 #tagCMDogzBuyBatteCount
class  tagCMDogzBuyBatteCount(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0xC3
        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 = 0xC3
        return
    def GetLength(self):
        return sizeof(tagCMDogzBuyBatteCount)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 C3 神兽购买助战位 //tagCMDogzBuyBatteCount:
                                Cmd:%s,
                                SubCmd:%s
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd
                                )
        return DumpString
m_NAtagCMDogzBuyBatteCount=tagCMDogzBuyBatteCount()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMDogzBuyBatteCount.Cmd,m_NAtagCMDogzBuyBatteCount.SubCmd))] = m_NAtagCMDogzBuyBatteCount
#------------------------------------------------------
# A5 C0 神兽穿戴装备 #tagCMDogzEquipItem
class  tagCMDogzEquipItem(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("DogzID", c_ubyte),    # 神兽ID
                  ("EquipIndex", c_ubyte),    #神兽装备所在神兽背包索引
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0xC0
        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 = 0xC0
        self.DogzID = 0
        self.EquipIndex = 0
        return
    def GetLength(self):
        return sizeof(tagCMDogzEquipItem)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 C0 神兽穿戴装备 //tagCMDogzEquipItem:
                                Cmd:%s,
                                SubCmd:%s,
                                DogzID:%d,
                                EquipIndex:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.DogzID,
                                self.EquipIndex
                                )
        return DumpString
m_NAtagCMDogzEquipItem=tagCMDogzEquipItem()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMDogzEquipItem.Cmd,m_NAtagCMDogzEquipItem.SubCmd))] = m_NAtagCMDogzEquipItem
#------------------------------------------------------
# A5 C4 神兽装备强化 #tagCMDogzEquipPlus
class  tagCMDogzEquipPlus(Structure):
    Head = tagHead()
    EquipIndex = 0    #(BYTE EquipIndex)//神兽装备背包中索引
    IndexCount = 0    #(BYTE IndexCount)//材料所在神兽物品背包索引的数量
    IndexList = list()    #(vector<BYTE> IndexList)//材料所在神兽物品背包索引列表
    IsDouble = 0    #(BYTE IsDouble)//是否双倍强化
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0xC4
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.EquipIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.IndexCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.IndexCount):
            value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
            self.IndexList.append(value)
        self.IsDouble,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0xC4
        self.EquipIndex = 0
        self.IndexCount = 0
        self.IndexList = list()
        self.IsDouble = 0
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 1
        length += 1 * self.IndexCount
        length += 1
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.EquipIndex)
        data = CommFunc.WriteBYTE(data, self.IndexCount)
        for i in range(self.IndexCount):
            data = CommFunc.WriteBYTE(data, self.IndexList[i])
        data = CommFunc.WriteBYTE(data, self.IsDouble)
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                EquipIndex:%d,
                                IndexCount:%d,
                                IndexList:%s,
                                IsDouble:%d
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.EquipIndex,
                                self.IndexCount,
                                "...",
                                self.IsDouble
                                )
        return DumpString
m_NAtagCMDogzEquipPlus=tagCMDogzEquipPlus()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMDogzEquipPlus.Head.Cmd,m_NAtagCMDogzEquipPlus.Head.SubCmd))] = m_NAtagCMDogzEquipPlus
#------------------------------------------------------
# A5 C1 神兽卸下装备 #tagCMDogzUnEquipItem
class  tagCMDogzUnEquipItem(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("DogzID", c_ubyte),    # 神兽ID
                  ("EquipPlace", c_ubyte),    #卸下的装备位, 0代表卸下全部
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0xC1
        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 = 0xC1
        self.DogzID = 0
        self.EquipPlace = 0
        return
    def GetLength(self):
        return sizeof(tagCMDogzUnEquipItem)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 C1 神兽卸下装备 //tagCMDogzUnEquipItem:
                                Cmd:%s,
                                SubCmd:%s,
                                DogzID:%d,
                                EquipPlace:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.DogzID,
                                self.EquipPlace
                                )
        return DumpString
m_NAtagCMDogzUnEquipItem=tagCMDogzUnEquipItem()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMDogzUnEquipItem.Cmd,m_NAtagCMDogzUnEquipItem.SubCmd))] = m_NAtagCMDogzUnEquipItem
#------------------------------------------------------
# A5 48 兑换大师等级经验 #tagCMExchangeMasterEXP
class  tagCMExchangeMasterEXP(Structure):
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -10662,6 +10662,114 @@
#------------------------------------------------------
# A3 C1 神兽助战状态刷新 #tagMCDogzHelpbattleState
class  tagMCDogzHelpbattleState(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("DogzID", c_ubyte),    # 神兽ID
                  ("BatteState", c_ubyte),    #是否已助战, 0否1是
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0xC1
        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 = 0xA3
        self.SubCmd = 0xC1
        self.DogzID = 0
        self.BatteState = 0
        return
    def GetLength(self):
        return sizeof(tagMCDogzHelpbattleState)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 C1 神兽助战状态刷新 //tagMCDogzHelpbattleState:
                                Cmd:%s,
                                SubCmd:%s,
                                DogzID:%d,
                                BatteState:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.DogzID,
                                self.BatteState
                                )
        return DumpString
m_NAtagMCDogzHelpbattleState=tagMCDogzHelpbattleState()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCDogzHelpbattleState.Cmd,m_NAtagMCDogzHelpbattleState.SubCmd))] = m_NAtagMCDogzHelpbattleState
#------------------------------------------------------
# A3 C0 神兽信息 #tagMCDogzInfo
class  tagMCDogzInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("BuyHelpbattleCount", c_ubyte),    #额外购买的助战数
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0xC0
        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 = 0xA3
        self.SubCmd = 0xC0
        self.BuyHelpbattleCount = 0
        return
    def GetLength(self):
        return sizeof(tagMCDogzInfo)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 C0 神兽信息 //tagMCDogzInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                BuyHelpbattleCount:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.BuyHelpbattleCount
                                )
        return DumpString
m_NAtagMCDogzInfo=tagMCDogzInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCDogzInfo.Cmd,m_NAtagMCDogzInfo.SubCmd))] = m_NAtagMCDogzInfo
#------------------------------------------------------
# A3 1C 通知装备分解信息 #tagMCEquipDecomposeInfo
class  tagMCEquipDecomposeInfo(Structure):
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -894,16 +894,15 @@
rptTempItem,        # 临时存放背包 29
rptTreasure,        # 寻宝物品背包 30
rptPet,             # 宠物背包(用物品存储宠物的数据) 31
rptDogzItem,        # 神兽物品背包 32
rptDogzEquip,       # 神兽装备背包 33
rptMax,             # 最大背包类型数量,放在最后一个
) = range(28, 28 + 5)  #C++定义的枚举到27
) = range(28, 28 + 7)  #C++定义的枚举到27
#虚拟背包类型, 从255递减
Def_VPack_TypeList = (
rptRune,            # 符印背包 255
) = range(256 - 1, 256)
#虚拟背包物品信息 ChConfig.Def_VPackItem_Dict
#武器的手持形式
@@ -1220,6 +1219,7 @@
Def_IudetPartSuiteLV = 25  # 部位套装等级 [套装类型1等级, 套装类型2等级, ...]
Def_IudetWingMaterialItemID = 27  # 翅膀精炼材料ID列表
Def_IudetWingMaterialItemCount = 29  # 翅膀精炼材料个数列表
Def_IudetDogzEquipPlus = 31  # 神兽装备强化信息列表 [强化等级, 累计总熟练度]
Def_IudetItemColor = 16  # 物品颜色,如果该值没有就取物品
Def_IudetItemCount = 18  # 物品个数,支持20亿,目前仅特殊转化物品会用到
@@ -1296,7 +1296,7 @@
)=range(5)
# 战斗力模块类型
Def_MFPType_Max = 24
Def_MFPType_Max = 25
ModuleFightPowerTypeList = (
Def_MFPType_Role, # 角色 0
Def_MFPType_Equip, # 装备(基本装备位) 1
@@ -1319,6 +1319,7 @@
Def_MFPType_PetSoul, # 灵宠魂石 18
Def_MFPType_HorseSoul, # 坐骑魂石 19
Def_MFPType_MagicWeaponSoul, # 法宝之魂 20
Def_MFPType_Dogz, # 神兽 21
Def_MFPType_Other, # 其他
#以下暂时没用到,改时再处理
@@ -1666,6 +1667,16 @@
) = range(1, 21)
# 神兽装备位定义
DogzEquipPlace = (
    dogzetHorn,     # 神兽兽角
    dogzetEye,      # 神兽魔眼
    dogzetTooth,    # 神兽獠牙
    dogzetClaw,     # 神兽兽爪
    dogzetScute,    # 神兽鳞甲
) = range(101, 101 + 5)
# 请求进入副本通用检查结果,优先提示的放前面(即索引越大,提示优先级越低)
EnterFBAskResult = (
    EntFBAskRet_OK,             # 0 可以进入 
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -1242,6 +1242,34 @@
PacketSubCMD_1=0x03
PacketCallFunc_1=OnActiveAllEquipAttr
;神兽
[PlayerDogz]
ScriptName = Player\PlayerDogz.py
Writer = hxp
Releaser = hxp
RegType = 0
RegisterPackCount = 5
PacketCMD_1=0xA5
PacketSubCMD_1=0xC0
PacketCallFunc_1=OnDogzEquipItem
PacketCMD_2=0xA5
PacketSubCMD_2=0xC1
PacketCallFunc_2=OnDogzUnEquipItem
PacketCMD_3=0xA5
PacketSubCMD_3=0xC2
PacketCallFunc_3=OnDogzBattleStateChange
PacketCMD_4=0xA5
PacketSubCMD_4=0xC3
PacketCallFunc_4=OnDogzBuyBatteCount
PacketCMD_5=0xA5
PacketSubCMD_5=0xC4
PacketCallFunc_5=OnDogzEquipPlus
;个推
[PlayerGeTui]
ScriptName = Player\PlayerGeTui.py
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -313,11 +313,6 @@
Def_ItemType_ResetAttrPoint = 59       #洗点卷轴 使用后将某个属性一定值变为未分配属性
Def_ItemType_DogzEquipExp = 70  # 神兽装备经验
Def_ItemType_DogzEquipHorn = 71      # 神兽装备兽角
Def_ItemType_DogzEquipEye = 72      # 神兽装备魔眼
Def_ItemType_DogzEquipTooth = 73      # 神兽装备獠牙
Def_ItemType_DogzEquipClaw = 74     # 神兽装备兽爪
Def_ItemType_DogzEquipSquama = 75       # 神兽装备鳞甲
Def_ItemType_TreasureBox = 81       #不限制开启条件宝箱
Def_ItemType_TreasureBox2 = 82       #限制开启条件宝箱
@@ -345,6 +340,12 @@
Def_ItemType_retBaldric5 = 117     #17 佩饰
Def_ItemType_retBaldric6 = 118     #18 佩饰
Def_ItemType_DogzEquipHorn = 119    # 神兽兽角
Def_ItemType_DogzEquipEye = 120     # 神兽魔眼
Def_ItemType_DogzEquipTooth = 121   # 神兽獠牙
Def_ItemType_DogzEquipClaw = 122    # 神兽兽爪
Def_ItemType_DogzEquipScute = 123   # 神兽鳞甲
#以下定义物品类型下次删除
Def_Item_Type_Horse = 1000036          #坐骑
@@ -354,16 +355,18 @@
                     }
#虚拟背包可以放入的物品字典
Def_VPackItem_Dict = {
Def_PackItemTypeList_Dict = {
ShareDefine.rptRune:[Def_ItemType_Rune, Def_ItemType_RuneExp],
ShareDefine.rptDogzItem:[Def_ItemType_DogzEquipExp, Def_ItemType_DogzEquipHorn, Def_ItemType_DogzEquipEye,
                         Def_ItemType_DogzEquipTooth, Def_ItemType_DogzEquipClaw, Def_ItemType_DogzEquipScute],
                      }
def GetItemPackType(itemType):
def GetItemPackType(itemType, defaultPack=IPY_GameWorld.rptItem):
    ## 获取物品类型对应存放的默认背包类型
    for pack, itemTypeList in Def_VPackItem_Dict.items():
    for pack, itemTypeList in Def_PackItemTypeList_Dict.items():
        if itemType in itemTypeList:
            return pack
    return IPY_GameWorld.rptItem
    return defaultPack
# 部位对应装备类型列表
Def_PlaceEquipType = {
@@ -410,6 +413,7 @@
Def_Effect_ResetAttrPoint = 231   # 洗点
Def_Effect_AddFBCnt = 233   # 增加副本可进入次数
Def_Effect_AddKillBossCnt = 234   # 增加BOSS可击杀次数
Def_Effect_DogzEquipPlusExp = 235   # 神兽强化材料经验效果,A值基础经验,B值双倍强化消耗仙玉
#----以下未使用或代码依然存在的---
Def_Effect_ItemGiveGongXun = 1920        #使用道具给予功勋
@@ -752,10 +756,13 @@
Def_EquipItemType_TJGAutoEat = xrange(Def_ItemType_retWeapon, Def_ItemType_retShoes + 1)
#装备类型
Def_EquipItemType = xrange(Def_ItemType_retWeapon, Def_ItemType_retBaldric6 + 1)
Def_EquipItemType = xrange(Def_ItemType_retWeapon, Def_ItemType_DogzEquipScute + 1)
#武器类型
Def_WeaponItemType = [Def_ItemType_retWeapon, Def_ItemType_retWeapon2]
#神兽装备类型
Def_DogzEquiipType = xrange(Def_ItemType_DogzEquipHorn, Def_ItemType_DogzEquipScute + 1)
# 技能造成实质性伤害的类型
Def_RealAttack_Type = [Def_HurtType_Normal,         # 普通伤害 1
@@ -810,6 +817,10 @@
Def_PackCnt_OfficerSkill = 0
#寻宝背包格子数
Def_PackCnt_Treasure = 100
#初始化神兽背包格子数
Def_PackCnt_DogzItem = 100
#初始化神兽装备格子数
Def_PackCnt_DogzEquip = 100
#初始化装备栏2
Def_PackCnt_Equip2 = 0
#初始化回收站
@@ -1051,6 +1062,8 @@
                                    ShareDefine.rptTempItem,
                                    ShareDefine.rptTreasure,
                                    ShareDefine.rptPet,
                                    ShareDefine.rptDogzItem,
                                    ShareDefine.rptDogzEquip,
                                    ]
#装备可强化背包列表
@@ -3766,6 +3779,11 @@
#套装
Def_PDict_EquipPartSuiteLV = "EQPartSuiteLV_%s_%s" #部位套装等级 参数 部位、套装类型
Def_PDict_EquipPartSuiteNotify = "EQPartSuiteNotify_%s_%s_%s" #部位套装提示记录 参数 组合类型、套装类型、X件
#神兽
Def_PDict_DogzFightState = "DogzFightState_%s" # 神兽助战状态,参数为key编号,按神兽ID二进制位存储
Def_PDict_DogzBuyHelpbattleCount = "DogzBuyHelpbattleCount" # 额外购买的神兽助战位
#-------------------------------------------------------------------------------
#可以从07 41封包购买的背包类型,和对应字典{背包类型:[字典key, 默认格子数]}
@@ -4165,7 +4183,8 @@
Def_CalcAttrFunc_StoveYao, # 炼丹炉丹药 32
Def_CalcAttrFunc_PetSign, # 宠物签到 33
Def_CalcAttrFunc_MagicWeaponSoul, # 法宝之魂属性34
) = range(35)
Def_CalcAttrFunc_Dogz, # 神兽35
) = range(36)
# 在此列表中的功能属性,不享受百分比加成,--属性参与战力计算
@@ -4202,6 +4221,7 @@
                            ShareDefine.Def_MFPType_MagicWeapon3:[Def_CalcAttrFunc_MagicWeapon3, Def_CalcAttrFunc_Stove, Def_CalcAttrFunc_VIP],
                            ShareDefine.Def_MFPType_StoveYao:[Def_CalcAttrFunc_StoveYao],
                            ShareDefine.Def_MFPType_MagicWeaponSoul:[Def_CalcAttrFunc_MagicWeaponSoul],
                            ShareDefine.Def_MFPType_Dogz:[Def_CalcAttrFunc_Dogz],
                            ShareDefine.Def_MFPType_Other:[Def_CalcAttrFunc_Success, Def_CalcAttrFunc_FamilyTech, Def_CalcAttrFunc_EquipDecompose],
                            }
@@ -4406,6 +4426,7 @@
Def_Cost_EnterFB, # 进入副本
Def_Cost_GameServer, # GameServer 30
Def_Cost_FreeGoods, # 极品白拿
Def_Cost_DogzEquipPlus, # 神兽装备强化
#-----------以下为暂时没用的,先不删除,如有新增消费点则放在这些之前------------
Def_Cost_RefreshArrestTask, # 刷新悬赏任务
Def_Cost_OffLineExp, # 兑换离线经验
@@ -4427,7 +4448,7 @@
Def_Cost_Trade, # 交易
Def_Cost_Rename, # 改名
Def_Cost_SkillLvUp, # 技能升级
) = range(2000, 2000 + 52)
) = range(2000, 2000 + 53)
Def_Cost_Reason_SonKey = "reason_name_son" # 消费点原因子类说明key
@@ -4506,6 +4527,7 @@
Def_Cost_FamilyBroadcast:"FamilyBroadcast",
Def_Cost_FamilyRedPacket:"FamilyRedPacket",
Def_Cost_FreeGoods:"FreeGoods",
Def_Cost_DogzEquipPlus:"DogzEquipPlus",
}
## -----------------------------------------------------
@@ -4654,7 +4676,8 @@
ItemDel_EquipSuit, # 套装 30
ItemDel_AddFBCnt, # 增加副本可进入次数 31
ItemDel_AddKillBossCnt, # 增加BOSS可击杀次数 32
) = range(2000, 2000 + 33)
ItemDel_DogzEquipPlus, # 神兽装备强化
) = range(2000, 2000 + 34)
# 物品扣除类型对应信息 {类型:eventName, ...}
ItemDelTypeDict = {
@@ -4691,6 +4714,7 @@
                   ItemDel_EquipSuit:"EquipSuit",
                   ItemDel_AddFBCnt:"AddFBCnt",
                   ItemDel_AddKillBossCnt:"AddKillBossCnt",
                   ItemDel_DogzEquipPlus:"DogzEquipPlus",
                   }
##==================================================================================================
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -7717,6 +7717,303 @@
#------------------------------------------------------
# A5 C2 神兽变更助战状态 #tagCMDogzBattleStateChange
class  tagCMDogzBattleStateChange(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("DogzID", c_ubyte),    # 神兽ID
                  ("BatteState", c_ubyte),    #助战状态,0-召回,1-助战
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0xC2
        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 = 0xC2
        self.DogzID = 0
        self.BatteState = 0
        return
    def GetLength(self):
        return sizeof(tagCMDogzBattleStateChange)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 C2 神兽变更助战状态 //tagCMDogzBattleStateChange:
                                Cmd:%s,
                                SubCmd:%s,
                                DogzID:%d,
                                BatteState:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.DogzID,
                                self.BatteState
                                )
        return DumpString
m_NAtagCMDogzBattleStateChange=tagCMDogzBattleStateChange()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMDogzBattleStateChange.Cmd,m_NAtagCMDogzBattleStateChange.SubCmd))] = m_NAtagCMDogzBattleStateChange
#------------------------------------------------------
# A5 C3 神兽购买助战位 #tagCMDogzBuyBatteCount
class  tagCMDogzBuyBatteCount(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0xC3
        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 = 0xC3
        return
    def GetLength(self):
        return sizeof(tagCMDogzBuyBatteCount)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 C3 神兽购买助战位 //tagCMDogzBuyBatteCount:
                                Cmd:%s,
                                SubCmd:%s
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd
                                )
        return DumpString
m_NAtagCMDogzBuyBatteCount=tagCMDogzBuyBatteCount()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMDogzBuyBatteCount.Cmd,m_NAtagCMDogzBuyBatteCount.SubCmd))] = m_NAtagCMDogzBuyBatteCount
#------------------------------------------------------
# A5 C0 神兽穿戴装备 #tagCMDogzEquipItem
class  tagCMDogzEquipItem(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("DogzID", c_ubyte),    # 神兽ID
                  ("EquipIndex", c_ubyte),    #神兽装备所在神兽背包索引
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0xC0
        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 = 0xC0
        self.DogzID = 0
        self.EquipIndex = 0
        return
    def GetLength(self):
        return sizeof(tagCMDogzEquipItem)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 C0 神兽穿戴装备 //tagCMDogzEquipItem:
                                Cmd:%s,
                                SubCmd:%s,
                                DogzID:%d,
                                EquipIndex:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.DogzID,
                                self.EquipIndex
                                )
        return DumpString
m_NAtagCMDogzEquipItem=tagCMDogzEquipItem()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMDogzEquipItem.Cmd,m_NAtagCMDogzEquipItem.SubCmd))] = m_NAtagCMDogzEquipItem
#------------------------------------------------------
# A5 C4 神兽装备强化 #tagCMDogzEquipPlus
class  tagCMDogzEquipPlus(Structure):
    Head = tagHead()
    EquipIndex = 0    #(BYTE EquipIndex)//神兽装备背包中索引
    IndexCount = 0    #(BYTE IndexCount)//材料所在神兽物品背包索引的数量
    IndexList = list()    #(vector<BYTE> IndexList)//材料所在神兽物品背包索引列表
    IsDouble = 0    #(BYTE IsDouble)//是否双倍强化
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0xC4
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.EquipIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.IndexCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.IndexCount):
            value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
            self.IndexList.append(value)
        self.IsDouble,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0xC4
        self.EquipIndex = 0
        self.IndexCount = 0
        self.IndexList = list()
        self.IsDouble = 0
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 1
        length += 1 * self.IndexCount
        length += 1
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.EquipIndex)
        data = CommFunc.WriteBYTE(data, self.IndexCount)
        for i in range(self.IndexCount):
            data = CommFunc.WriteBYTE(data, self.IndexList[i])
        data = CommFunc.WriteBYTE(data, self.IsDouble)
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                EquipIndex:%d,
                                IndexCount:%d,
                                IndexList:%s,
                                IsDouble:%d
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.EquipIndex,
                                self.IndexCount,
                                "...",
                                self.IsDouble
                                )
        return DumpString
m_NAtagCMDogzEquipPlus=tagCMDogzEquipPlus()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMDogzEquipPlus.Head.Cmd,m_NAtagCMDogzEquipPlus.Head.SubCmd))] = m_NAtagCMDogzEquipPlus
#------------------------------------------------------
# A5 C1 神兽卸下装备 #tagCMDogzUnEquipItem
class  tagCMDogzUnEquipItem(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("DogzID", c_ubyte),    # 神兽ID
                  ("EquipPlace", c_ubyte),    #卸下的装备位, 0代表卸下全部
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0xC1
        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 = 0xC1
        self.DogzID = 0
        self.EquipPlace = 0
        return
    def GetLength(self):
        return sizeof(tagCMDogzUnEquipItem)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 C1 神兽卸下装备 //tagCMDogzUnEquipItem:
                                Cmd:%s,
                                SubCmd:%s,
                                DogzID:%d,
                                EquipPlace:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.DogzID,
                                self.EquipPlace
                                )
        return DumpString
m_NAtagCMDogzUnEquipItem=tagCMDogzUnEquipItem()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMDogzUnEquipItem.Cmd,m_NAtagCMDogzUnEquipItem.SubCmd))] = m_NAtagCMDogzUnEquipItem
#------------------------------------------------------
# A5 48 兑换大师等级经验 #tagCMExchangeMasterEXP
class  tagCMExchangeMasterEXP(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -10662,6 +10662,114 @@
#------------------------------------------------------
# A3 C1 神兽助战状态刷新 #tagMCDogzHelpbattleState
class  tagMCDogzHelpbattleState(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("DogzID", c_ubyte),    # 神兽ID
                  ("BatteState", c_ubyte),    #是否已助战, 0否1是
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0xC1
        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 = 0xA3
        self.SubCmd = 0xC1
        self.DogzID = 0
        self.BatteState = 0
        return
    def GetLength(self):
        return sizeof(tagMCDogzHelpbattleState)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 C1 神兽助战状态刷新 //tagMCDogzHelpbattleState:
                                Cmd:%s,
                                SubCmd:%s,
                                DogzID:%d,
                                BatteState:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.DogzID,
                                self.BatteState
                                )
        return DumpString
m_NAtagMCDogzHelpbattleState=tagMCDogzHelpbattleState()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCDogzHelpbattleState.Cmd,m_NAtagMCDogzHelpbattleState.SubCmd))] = m_NAtagMCDogzHelpbattleState
#------------------------------------------------------
# A3 C0 神兽信息 #tagMCDogzInfo
class  tagMCDogzInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("BuyHelpbattleCount", c_ubyte),    #额外购买的助战数
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0xC0
        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 = 0xA3
        self.SubCmd = 0xC0
        self.BuyHelpbattleCount = 0
        return
    def GetLength(self):
        return sizeof(tagMCDogzInfo)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 C0 神兽信息 //tagMCDogzInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                BuyHelpbattleCount:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.BuyHelpbattleCount
                                )
        return DumpString
m_NAtagMCDogzInfo=tagMCDogzInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCDogzInfo.Cmd,m_NAtagMCDogzInfo.SubCmd))] = m_NAtagMCDogzInfo
#------------------------------------------------------
# A3 1C 通知装备分解信息 #tagMCEquipDecomposeInfo
class  tagMCEquipDecomposeInfo(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py
@@ -50,6 +50,7 @@
                   ShareDefine.Def_MFPType_PetSoul:"宠魂",
                   ShareDefine.Def_MFPType_HorseSoul:"骑魂",
                   ShareDefine.Def_MFPType_MagicWeaponSoul:"法宝之魂",
                   ShareDefine.Def_MFPType_Dogz:"神兽",
                   ShareDefine.Def_MFPType_Other:"其他",
                   }
    
@@ -89,6 +90,7 @@
                     ChConfig.Def_CalcAttrFunc_StoveYao:"炼丹炉丹药",
                     ChConfig.Def_CalcAttrFunc_PetSign:"宠物签到",
                     ChConfig.Def_CalcAttrFunc_MagicWeaponSoul:"法宝之魂",
                     ChConfig.Def_CalcAttrFunc_Dogz:"神兽",
                     }
    
    GameWorld.DebugAnswer(curPlayer, "PrintFightPower 模块类型(可选)")
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -125,6 +125,22 @@
                        ("list", "AttrValue", 0),
                        ),
                "Dogz":(
                        ("BYTE", "DogzID", 1),
                        ("list", "BaseAttrTypes", 0),
                        ("list", "BaseAttrValues", 0),
                        ("list", "HelpBattleSkills", 0),
                        ("list", "EquipPlaceColorList", 0),
                        ),
                "DogzEquipPlus":(
                        ("BYTE", "EquipPlace", 1),
                        ("BYTE", "PlusLV", 1),
                        ("list", "PlusAttrTypes", 0),
                        ("list", "PlusAttrValues", 0),
                        ("DWORD", "PlusLVUPTotalExp", 0),
                        ),
                "Rune":(
                        ("DWORD", "ID", 1),
                        ("list", "AttrType", 0),
@@ -1132,6 +1148,40 @@
    def GetStarsNeed(self): return self.StarsNeed # 全身星数
    def GetAttrType(self): return self.AttrType # 属性类型
    def GetAttrValue(self): return self.AttrValue # 属性值
# 神兽表
class IPY_Dogz():
    def __init__(self):
        self.DogzID = 0
        self.BaseAttrTypes = []
        self.BaseAttrValues = []
        self.HelpBattleSkills = []
        self.EquipPlaceColorList = []
        return
    def GetDogzID(self): return self.DogzID # 神兽ID
    def GetBaseAttrTypes(self): return self.BaseAttrTypes # 基础属性类型列表
    def GetBaseAttrValues(self): return self.BaseAttrValues # 基础属性值列表
    def GetHelpBattleSkills(self): return self.HelpBattleSkills # 助战技能ID列表
    def GetEquipPlaceColorList(self): return self.EquipPlaceColorList # 穿戴装备颜色限制
# 神兽强化表
class IPY_DogzEquipPlus():
    def __init__(self):
        self.EquipPlace = 0
        self.PlusLV = 0
        self.PlusAttrTypes = []
        self.PlusAttrValues = []
        self.PlusLVUPTotalExp = 0
        return
    def GetEquipPlace(self): return self.EquipPlace # 装备位
    def GetPlusLV(self): return self.PlusLV # 强化等级
    def GetPlusAttrTypes(self): return self.PlusAttrTypes # 强化属性类型列表
    def GetPlusAttrValues(self): return self.PlusAttrValues # 强化属性值列表
    def GetPlusLVUPTotalExp(self): return self.PlusLVUPTotalExp # 升级所需累计熟练度总值
# 符印表
class IPY_Rune():
@@ -2873,6 +2923,10 @@
        self.ipyItemPlusSumAttrLen = len(self.ipyItemPlusSumAttrCache)
        self.ipyRoleEquipStarsCache = self.__LoadFileData("RoleEquipStars", IPY_RoleEquipStars)
        self.ipyRoleEquipStarsLen = len(self.ipyRoleEquipStarsCache)
        self.ipyDogzCache = self.__LoadFileData("Dogz", IPY_Dogz)
        self.ipyDogzLen = len(self.ipyDogzCache)
        self.ipyDogzEquipPlusCache = self.__LoadFileData("DogzEquipPlus", IPY_DogzEquipPlus)
        self.ipyDogzEquipPlusLen = len(self.ipyDogzEquipPlusCache)
        self.ipyRuneCache = self.__LoadFileData("Rune", IPY_Rune)
        self.ipyRuneLen = len(self.ipyRuneCache)
        self.ipyEquipWashCache = self.__LoadFileData("EquipWash", IPY_EquipWash)
@@ -3207,6 +3261,10 @@
    def GetItemPlusSumAttrByIndex(self, index): return self.ipyItemPlusSumAttrCache[index]
    def GetRoleEquipStarsCount(self): return self.ipyRoleEquipStarsLen
    def GetRoleEquipStarsByIndex(self, index): return self.ipyRoleEquipStarsCache[index]
    def GetDogzCount(self): return self.ipyDogzLen
    def GetDogzByIndex(self, index): return self.ipyDogzCache[index]
    def GetDogzEquipPlusCount(self): return self.ipyDogzEquipPlusLen
    def GetDogzEquipPlusByIndex(self, index): return self.ipyDogzEquipPlusCache[index]
    def GetRuneCount(self): return self.ipyRuneLen
    def GetRuneByIndex(self, index): return self.ipyRuneCache[index]
    def GetEquipWashCount(self): return self.ipyEquipWashLen
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -1094,12 +1094,7 @@
        if not curItemData:
            return False
        
        vPackItemDict = ChConfig.Def_VPackItem_Dict
        for pack, itemTypeList in vPackItemDict.items():
            if curItemData.GetType() in itemTypeList:
                packIndex = pack
                break
        packIndex = ChConfig.GetItemPackType(curItemData.GetType(), packIndex)
  
        if not self.CanPutInItem(packIndex, tagItem.GetItemTypeID(), tagItem.GetCount(), tagItem.GetIsBind(), defaultPile):
            GameWorld.DebugLog("背包满,不能放入物品 count = %d"%tagItem.GetCount())
@@ -1882,11 +1877,10 @@
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_GetSpecialItem, 1, [itemID])
        return True
    
    vPackItemDict = ChConfig.Def_VPackItem_Dict
    for pack, itemTypeList in vPackItemDict.items():
        if curItemData.GetType() in itemTypeList:
            packIndexList = [pack]
            break
    defaultPack = IPY_GameWorld.rptItem if not packIndexList else packIndexList[0]
    packIndex = ChConfig.GetItemPackType(curItemData.GetType(), defaultPack)
    if packIndex != defaultPack or not packIndexList:
        packIndexList = [packIndex]
    
    if not __Check_CanPutItemInPack(curPlayer, itemID, itemCount, itemIsBind, packIndexList, defaultPile):
        #不可放入
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
@@ -1592,11 +1592,17 @@
def DoLogicSwitchItemEx(curPlayer, srcBackpack, desBackPack, srcIndex, destIndex):
    
    #---物品检查---
    srcItem = curPlayer.GetItemManager().GetPack(srcBackpack).GetAt(srcIndex)
    srcPack = curPlayer.GetItemManager().GetPack(srcBackpack)
    if srcIndex < 0 or srcIndex >= srcPack.GetCount():
        return
    srcItem = srcPack.GetAt(srcIndex)
    if not CheckItemCanUse(srcItem):
        return
    
    destItem = curPlayer.GetItemManager().GetPack(desBackPack).GetAt(destIndex)
    destPack = curPlayer.GetItemManager().GetPack(desBackPack)
    if destIndex < 0 or destIndex >= destPack.GetCount():
        return
    destItem = destPack.GetAt(destIndex)
    #目标格子只验证锁定, 可以允许空位
    if destItem == None or destItem.GetIsLocked():
        return
@@ -1675,6 +1681,10 @@
def GetIsEquip(curItem):
    return curItem.GetType() in ChConfig.Def_EquipItemType
def GetIsDogzEquip(curItem):
    ## 返回是否神兽装备
    return curItem.GetType() in ChConfig.Def_DogzEquiipType
## 返回是否武器
#  @param curItem 当前物品
#  @return None
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -110,6 +110,7 @@
import PyGameData
import PlayerCoin
import PlayerGeTui
import PlayerDogz
import datetime
import time
@@ -535,6 +536,8 @@
    SyncPackDownloadAward(curPlayer)
    # 登录触发功能开启(老号处理)
    GameFuncComm.DoFuncOpenLogic(curPlayer)
    # 神兽
    PlayerDogz.OnPlayerLogin(curPlayer)
    # 上线查询一次充值订单
    curPlayer.SendDBQueryRecharge()
    
@@ -1028,6 +1031,15 @@
    #初始化寻宝背包
    PlayerControl.Init_TreasurePack(curPlayer)
    
    #初始化神兽物品背包
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzItem)
    curPack.SetCount(ChConfig.Def_PackCnt_DogzItem)
    curPack.Sync_PackCanUseCount()
    #初始化神兽装备背包
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
    curPack.SetCount(ChConfig.Def_PackCnt_DogzEquip)
    curPack.Sync_PackCanUseCount()
    #初始化临时交换背包
    curPack = itemManager.GetPack(ShareDefine.rptTempSwap)
    curPack.SetCount(ChConfig.Def_PackCnt_TempSwap)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -86,6 +86,7 @@
import ChNetSendPack
import PlayerState
import QuestCommon
import PlayerDogz
import GMShell
import random
@@ -3960,6 +3961,7 @@
        PlayerRefineStove.CalcStoveAttr(curPlayer)
        PlayerFamilyTech.CalcFamilyTechAttr(curPlayer)
        PlayerEquipDecompose.RefreshEDAttr(curPlayer)
        PlayerDogz.RefreshDogzAttr(curPlayer)
        self.RefreshAllState(isForce=True)
        GameWorld.DebugLog("End ReCalcAllState!!!")
        return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py
New file
@@ -0,0 +1,514 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Player.PlayerDogz
#
# @todo:神兽系统
# @author hxp
# @date 2018-08-20
# @version 1.0
#
# 详细描述: 神兽系统
#
#-------------------------------------------------------------------------------
#"""Version = 2018-08-20 17:00"""
#-------------------------------------------------------------------------------
import GameWorld
import ItemCommon
import ShareDefine
import PlayerControl
import ChPyNetSendPack
import NetPackCommon
import IPY_GameWorld
import IpyGameDataPY
import ChConfig
import ChEquip
'''
神兽编号: 1~20,上线后不可修改
神兽装备位: 101~105 物品表中的装备位配置
神兽装备类型:119~123,策划说打死不会再加类型了,固定5个神兽装备类型
神兽物品背包(类型32,暂开放100格),存放神兽装备(类型119~123),及强化材料(类型70),
神兽装备背包(类型33,暂开放100格),所有神兽共用,每只神兽5格,(格子索引/5)+1=对应神兽编号,(格子索引%5)+100+1=对应神兽装备位
'''
DogzEquipCount = 5 # 神兽装备位数量,固定5个,策划说打死也不改
def GetDogzEquipPlaceIndex(equipPlace):
    ## 获取神兽装备位对应的索引
    return equipPlace - 1 - 100
def GetDogzEquipPackIndex(dogzID, equipPlaceIndex):
    ## 获取神兽装备在神兽装备背包中的固定位置索引
    return (dogzID - 1) * DogzEquipCount + equipPlaceIndex
def GetDogzIsHelpFight(curPlayer, dogzID):
    ## 神兽是否助战状态
    return GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_DogzFightState, dogzID - 1)
def SetDogzIsHelpFight(curPlayer, dogzID, isFight):
    ## 设置神兽是否助战状态
    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_DogzFightState, dogzID - 1, 1 if isFight else 0)
    Sync_DogzHelpbattleState(curPlayer, dogzID, isFight)
    return
def OnPlayerLogin(curPlayer):
    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DogzBuyHelpbattleCount):
        Sync_DogzInfo(curPlayer)
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for i in xrange(ipyDataMgr.GetDogzCount()):
        ipyData = ipyDataMgr.GetDogzByIndex(i)
        if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_DogzFightState, i):
            Sync_DogzHelpbattleState(curPlayer, ipyData.GetDogzID(), 1)
    return
#// A5 C0 神兽穿戴装备 #tagCMDogzEquipItem
#
#struct    tagCMDogzEquipItem
#
#{
#    tagHead        Head;
#    BYTE        DogzID;    // 神兽ID
#    BYTE        EquipIndex;    //神兽装备所在神兽背包索引
#};
def OnDogzEquipItem(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    dogzID = clientData.DogzID
    equipIndex = clientData.EquipIndex
    ipyData = IpyGameDataPY.GetIpyGameData("Dogz", dogzID)
    if not ipyData:
        return
    dogzItemPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzItem)
    curEquip = dogzItemPack.GetAt(equipIndex)
    if not ItemCommon.CheckItemCanUse(curEquip):
        GameWorld.DebugLog("物品不可用: equipIndex=%s" % equipIndex)
        return
    if not ItemCommon.GetIsDogzEquip(curEquip):
        GameWorld.DebugLog("非神兽装备: equipIndex=%s" % equipIndex)
        return
    equipPlace = curEquip.GetEquipPlace()
    equipPlaceIndex = GetDogzEquipPlaceIndex(equipPlace)
    equipPlaceColorList = ipyData.GetEquipPlaceColorList()
    if equipPlaceIndex < 0 or equipPlaceIndex >= len(equipPlaceColorList):
        GameWorld.ErrLog("神兽装备位异常: equipPlace=%s,equipPlaceIndex=%s" % (equipPlace, equipPlaceIndex))
        return
    dogzEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
    equipPackIndex = GetDogzEquipPackIndex(dogzID, equipPlaceIndex)
    if equipPackIndex < 0 or equipPackIndex >= dogzEquipPack.GetCount():
        GameWorld.ErrLog("神兽装备背包索引异常: dogzID=%s,equipPlace=%s,equipPackIndex=%s" % (dogzID, equipPlace, equipPackIndex))
        return
    equipColor = curEquip.GetItemColor()
    limitColor = equipPlaceColorList[equipPlaceIndex]
    if equipColor < limitColor:
        GameWorld.Log("神兽装备位穿戴颜色限制:dogzID=%s,equipPlaceIndex=%s,limitColor=%s > equipColor=%s"
                      % (dogzID, equipPlaceIndex, limitColor, equipColor), playerID)
        return
    destEquip = dogzEquipPack.GetAt(equipPackIndex)
    isOK = ItemCommon.DoLogicSwitchItem(curPlayer, curEquip, destEquip, ShareDefine.rptDogzEquip)
    if not isOK:
        return
    # 助战状态换装需要刷属性
    if GetDogzIsHelpFight(curPlayer, dogzID):
        RefreshDogzAttr(curPlayer)
    return
#// A5 C1 神兽卸下装备 #tagCMDogzUnEquipItem
#
#struct    tagCMDogzUnEquipItem
#
#{
#    tagHead        Head;
#    BYTE        DogzID;    // 神兽ID
#    BYTE        EquipPlace;    //卸下的装备位, 0代表卸下全部
#};
def OnDogzUnEquipItem(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    dogzID = clientData.DogzID
    equipPlace = clientData.EquipPlace
    if equipPlace and equipPlace not in ShareDefine.DogzEquipPlace:
        GameWorld.DebugLog("非神兽装备位,无法卸下!equipPlace=%s" % equipPlace, playerID)
        return
    ipyData = IpyGameDataPY.GetIpyGameData("Dogz", dogzID)
    if not ipyData:
        return
    # 卸下全部
    if equipPlace == 0:
        unEquipIndexList = [] # 需要脱下的神兽装备索引
        dogzEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
        equipPackCount = dogzEquipPack.GetCount()
        startIndex = (dogzID - 1) * DogzEquipCount
        for i in range(startIndex, startIndex + DogzEquipCount):
            if i < 0 or i >= equipPackCount:
                return
            curItem = dogzEquipPack.GetAt(i)
            if not curItem.IsEmpty():
                unEquipIndexList.append(i)
        if not unEquipIndexList:
            GameWorld.DebugLog("没有穿戴神兽装备!dogzID=%s" % dogzID, playerID)
            return
        unEquipCount = len(unEquipIndexList)
        emptyIndexList = []
        dogzItemPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzItem)
        for i in xrange(dogzItemPack.GetCount()):
            curItem = dogzItemPack.GetAt(i)
            if curItem.IsEmpty():
                emptyIndexList.append(i)
                if len(emptyIndexList) >= unEquipCount:
                    break
        if len(emptyIndexList) < unEquipCount:
            PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [ShareDefine.rptDogzItem])
            #GameWorld.DebugLog("神兽背包空格不足,无法脱下所有装备")
            return
        for i in xrange(unEquipCount):
            ItemCommon.DoLogicSwitchItemEx(curPlayer, ShareDefine.rptDogzEquip, ShareDefine.rptDogzItem,
                                           unEquipIndexList[i], emptyIndexList[i])
    else:
        equipPackIndex = GetDogzEquipPackIndex(dogzID, GetDogzEquipPlaceIndex(equipPlace))
        emptyIndex = ItemCommon.GetEmptyIndexInPack(curPlayer, ShareDefine.rptDogzItem)
        if not ItemCommon.DoLogicSwitchItemEx(curPlayer, ShareDefine.rptDogzEquip, ShareDefine.rptDogzItem, equipPackIndex, emptyIndex):
            GameWorld.DebugLog("神兽卸下装备失败: dogzID=%s,equipPlace=%s" % (dogzID, equipPlace), playerID)
            return
    # 助战状态换装需要刷属性
    if GetDogzIsHelpFight(curPlayer, dogzID):
        SetDogzIsHelpFight(curPlayer, dogzID, False) # 因为脱下了状态,所以必须设置为非助战状态
        RefreshDogzAttr(curPlayer)
    return
#// A5 C2 神兽变更助战状态 #tagCMDogzBattleStateChange
#
#struct    tagCMDogzBattleStateChange
#
#{
#    tagHead        Head;
#    BYTE        DogzID;    // 神兽ID
#    BYTE        BatteState;    //助战状态,0-召回,1-助战
#};
def OnDogzBattleStateChange(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    dogzID = clientData.DogzID
    batteState = clientData.BatteState
    ipyData = IpyGameDataPY.GetIpyGameData("Dogz", dogzID)
    if not ipyData:
        return
    curState = GetDogzIsHelpFight(curPlayer, dogzID)
    if curState == batteState:
        GameWorld.DebugLog("神兽已经是该状态,无需变更助战状态! dogzID=%s,batteState=%s,curState=%s"
                           % (dogzID, batteState, curState), playerID)
        return
    # 变为助战状态需检查神兽装备是否穿满
    if batteState:
        helpbattleInitCount = IpyGameDataPY.GetFuncEvalCfg("DogzAssist", 1)[0]
        helpbattleBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DogzBuyHelpbattleCount)
        canHelpFightCount = helpbattleInitCount + helpbattleBuyCount
        curHelpFightCount = 0
        dogzCount = IpyGameDataPY.IPY_Data().GetDogzCount()
        for i in xrange(dogzCount):
            if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_DogzFightState, i):
                curHelpFightCount += 1
        if curHelpFightCount >= canHelpFightCount:
            GameWorld.DebugLog("当前神兽助战数已满,无法助战!canHelpFightCount=%s <= curHelpFightCount=%s"
                               % (canHelpFightCount, curHelpFightCount), playerID)
            return
        dogzEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
        equipPackCount = dogzEquipPack.GetCount()
        startIndex = (dogzID - 1) * DogzEquipCount
        for i in range(startIndex, startIndex + DogzEquipCount):
            if i < 0 or i >= equipPackCount:
                return
            curItem = dogzEquipPack.GetAt(i)
            if curItem.IsEmpty():
                GameWorld.DebugLog("神兽有装备未穿戴,无法助战!dogzID=%s,packIndex=%s" % (dogzID, i), playerID)
                return
    isFight = True if batteState else False
    GameWorld.DebugLog("神兽助战状态变更!dogzID=%s,isFight=%s" % (dogzID, isFight), playerID)
    SetDogzIsHelpFight(curPlayer, dogzID, isFight)
    RefreshDogzAttr(curPlayer)
    return
#// A5 C3 神兽购买助战位 #tagCMDogzBuyBatteCount
#
#struct    tagCMDogzBuyBatteCount
#
#{
#    tagHead        Head;
#};
def OnDogzBuyBatteCount(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    helpbattleInitCount, helpbattleMaxCount = IpyGameDataPY.GetFuncEvalCfg("DogzAssist", 1)
    helpbattleBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DogzBuyHelpbattleCount)
    curHelpFightCount = helpbattleInitCount + helpbattleBuyCount
    if curHelpFightCount >= helpbattleMaxCount:
        GameWorld.DebugLog("已超过最大神兽助战数,无法购买!curHelpFightCount=%s,helpbattleMaxCount=%s"
                           % (curHelpFightCount, helpbattleMaxCount), playerID)
        return
    needItemID = IpyGameDataPY.GetFuncCfg("DogzAssist", 2)
    needCountList = IpyGameDataPY.GetFuncEvalCfg("DogzAssist", 3)
    needCount = needCountList[-1] if helpbattleBuyCount >= len(needCountList) else needCountList[helpbattleBuyCount]
    costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, needItemID)
    if bindCnt + unBindCnt < needCount:
        GameWorld.DebugLog("购买神兽助战位所需道具不足 !needItemID=%s,needCount=%s" % (needItemID, needCount), playerID)
        return
    ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, needCount, "DogzBuyHelpFight")
    updBuyCount = helpbattleBuyCount + 1
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DogzBuyHelpbattleCount, updBuyCount)
    GameWorld.DebugLog("购买神兽助战位! updBuyCount=%s" % updBuyCount, playerID)
    Sync_DogzInfo(curPlayer)
    return
#// A5 C4 神兽装备强化 #tagCMDogzEquipPlus
#
#struct    tagCMDogzEquipPlus
#
#{
#    tagHead        Head;
#    BYTE        EquipIndex;    //神兽装备背包中索引
#    BYTE        IndexCount;        //材料所在神兽物品背包索引的数量
#    BYTE        IndexList[IndexCount];    //材料所在神兽物品背包索引列表
#    BYTE        IsDouble;        //是否双倍强化
#};
def OnDogzEquipPlus(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    equipIndex = clientData.EquipIndex
    indexList = clientData.IndexList
    isDouble = clientData.IsDouble
    GameWorld.DebugLog("神兽装备强化: equipIndex=%s,indexList=%s,isDouble=%s" % (equipIndex, indexList, isDouble), playerID)
    dogzEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
    curEquip = dogzEquipPack.GetAt(equipIndex)
    if not ItemCommon.CheckItemCanUse(curEquip) or not ItemCommon.GetIsDogzEquip(curEquip):
        GameWorld.DebugLog("    非神兽装备,无法强化!equipIndex=%s,itemID=%s"
                           % (equipIndex, curEquip.GetItemTypeID()), playerID)
        return
    equipPlace = curEquip.GetEquipPlace()
    curPlusLV = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetDogzEquipPlus, 0)
    curPlusExpTotal = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetDogzEquipPlus, 1)
    ipyData = IpyGameDataPY.GetIpyGameData("DogzEquipPlus", equipPlace, curPlusLV)
    if not ipyData:
        return
    curLVUPTotalExp = ipyData.GetPlusLVUPTotalExp()
    if not curLVUPTotalExp:
        GameWorld.Log("神兽装备升级所需总经验为0, 无法强化!equipPlace=%s,curPlusLV=%s" % (equipPlace, curPlusLV), playerID)
        return
    nextLVIpyData = None
    if curPlusExpTotal >= curLVUPTotalExp:
        nextLVIpyData = IpyGameDataPY.GetIpyGameDataNotLog("DogzEquipPlus", equipPlace, curPlusLV + 1)
        if not nextLVIpyData:
            GameWorld.Log("神兽装备已满级, 无法强化!equipPlace=%s,curPlusLV=%s" % (equipPlace, curPlusLV), playerID)
            return
    costGoldTotal = 0
    addExpTotal = 0
    delItemList = []
    dogzItemPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzItem)
    dogzItemPackCount = dogzItemPack.GetCount()
    for i in indexList:
        if i < 0 or i >= dogzItemPackCount:
            GameWorld.ErrLog("神兽背包索引不存在,无法强化!i=%s" % (i), playerID)
            return
        curItem = dogzItemPack.GetAt(i)
        if curItem.IsEmpty():
            GameWorld.ErrLog("神兽背包物品为空,无法强化!i=%s" % (i), playerID)
            return
        effect = ItemCommon.GetItemEffectByEffectID(curItem, ChConfig.Def_Effect_DogzEquipPlusExp)
        if not effect:
            GameWorld.ErrLog("神兽背包物品无经验效果,无法强化!i=%s,itemID=%s" % (i, curItem.GetItemTypeID()), playerID)
            return
        baseExp = effect.GetEffectValue(0)
        doubleCostGold = effect.GetEffectValue(1)
        addExp = baseExp
        plusInfoCount = curItem.GetUserAttrCount(ShareDefine.Def_IudetDogzEquipPlus)
        if not plusInfoCount:
            if isDouble and doubleCostGold:
                addExp = (baseExp * 2)
                costGoldTotal += doubleCostGold
            GameWorld.DebugLog("    强化: addExp=%s,baseExp=%s,isDouble=%s,doubleCostGold=%s,costGoldTotal=%s"
                               % (addExp, baseExp, isDouble, doubleCostGold, costGoldTotal), playerID)
        else:
            #plusLV = curItem.GetUserAttrByIndex(ShareDefine.Def_IudetDogzEquipPlus, 0)
            plusExpTotal = curItem.GetUserAttrByIndex(ShareDefine.Def_IudetDogzEquipPlus, 1)
            addExp += plusExpTotal
            GameWorld.DebugLog("    强化: addExp=%s,baseExp=%s,plusExpTotal=%s" % (addExp, baseExp, plusExpTotal), playerID)
        addExpTotal += addExp
        delItemList.append(curItem)
    if not delItemList:
        GameWorld.DebugLog("    没有材料可强化!", playerID)
        return
    updPlusExpTotal = curPlusExpTotal + addExpTotal
    infoDict = {"updPlusExpTotal":updPlusExpTotal}
    if costGoldTotal:
        if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGoldTotal,
                                      ChConfig.Def_Cost_DogzEquipPlus, infoDict):
            return
    for delItem in delItemList:
        ItemCommon.DelItem(curPlayer, delItem, curItem.GetCount(), False, ChConfig.ItemDel_DogzEquipPlus, infoDict)
    updPlusLV = curPlusLV
    if updPlusExpTotal >= curLVUPTotalExp:
        doCount = 0
        while nextLVIpyData and updPlusExpTotal >= nextLVIpyData.GetPlusLVUPTotalExp() and doCount < 100:
            doCount += 1
            nextLV = updPlusLV + 1
            nextLVIpyData = IpyGameDataPY.GetIpyGameDataNotLog("DogzEquipPlus", equipPlace, nextLV)
            if not nextLVIpyData:
                break
            updPlusLV = nextLV
    isRefreshAtrr = False
    # 未强化过
    if not curPlusExpTotal:
        curEquip.AddUserAttr(ShareDefine.Def_IudetDogzEquipPlus, updPlusLV)
        curEquip.AddUserAttr(ShareDefine.Def_IudetDogzEquipPlus, updPlusExpTotal)
        isRefreshAtrr = (updPlusLV > 0)
    else:
        if curPlusLV != updPlusLV:
            isRefreshAtrr = True
            curEquip.UpdataUserAttrByIndex(ShareDefine.Def_IudetDogzEquipPlus, 0, updPlusLV)
        curEquip.UpdataUserAttrByIndex(ShareDefine.Def_IudetDogzEquipPlus, 1, updPlusExpTotal)
    GameWorld.DebugLog("    curPlus(LV=%s,EXP=%s),addExpTotal=%s,updPlus(LV=%s,EXP=%s)"
                       % (curPlusLV, curPlusExpTotal, addExpTotal, updPlusLV, updPlusExpTotal), playerID)
    if isRefreshAtrr:
        RefreshDogzAttr(curPlayer)
    return
def RefreshDogzAttr(curPlayer):
    ## 刷新神兽属性
    allAttrList = [{} for _ in range(4)]
    dogzEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
    equipPackCount = dogzEquipPack.GetCount()
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for dogzIndex in xrange(ipyDataMgr.GetDogzCount()):
        if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_DogzFightState, dogzIndex):
            continue
        ipyData = ipyDataMgr.GetDogzByIndex(dogzIndex)
        dogzID = ipyData.GetDogzID()
        #GameWorld.DebugLog("神兽属性: dogzID=%s" % dogzID)
        # 1. 基础属性
        attrTypeList = ipyData.GetBaseAttrTypes()
        attrValueList = ipyData.GetBaseAttrValues()
        if attrTypeList and len(attrTypeList) == len(attrValueList):
            for attrIndex, baseAttrID in enumerate(attrTypeList):
                baseAttrValue = attrValueList[attrIndex]
                PlayerControl.CalcAttrDict_Type(baseAttrID, baseAttrValue, allAttrList)
                #GameWorld.DebugLog("    基础属性: baseAttrID=%s,baseAttrValue=%s, %s" % (baseAttrID, baseAttrValue, allAttrList))
        # 2. 装备属性
        startIndex = (dogzID - 1) * DogzEquipCount
        for equipIndex in range(startIndex, startIndex + DogzEquipCount):
            if equipIndex < 0 or equipIndex >= equipPackCount:
                break
            curEquip = dogzEquipPack.GetAt(equipIndex)
            if curEquip.IsEmpty():
                continue
            #itemID = curEquip.GetItemTypeID()
            # 装备基础属性
            for effIndex in xrange(curEquip.GetEffectCount()):
                curEffect = curEquip.GetEffectByIndex(effIndex)
                if not curEffect or not curEffect.GetEffectID():
                    break
                effID = curEffect.GetEffectID()
                if not effID or effID == ChConfig.Def_Effect_DogzEquipPlusExp:
                    continue
                effValue = curEffect.GetEffectValue(0)
                PlayerControl.CalcAttrDict_Type(effID, effValue, allAttrList)
                #GameWorld.DebugLog("    装备基础: itemID=%s,effID=%s,effValue=%s, %s" % (itemID, effID, effValue, allAttrList))
            # 强化属性
            curPlusLV = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetDogzEquipPlus, 0)
            plusIpyData = IpyGameDataPY.GetIpyGameData("DogzEquipPlus", curEquip.GetEquipPlace(), curPlusLV)
            if plusIpyData:
                plusAttrTypeList = plusIpyData.GetPlusAttrTypes()
                plusAttrValueList = plusIpyData.GetPlusAttrValues()
                if plusAttrTypeList and len(plusAttrTypeList) == len(plusAttrValueList):
                    for plusIndex, plusAttrID in enumerate(plusAttrTypeList):
                        plusAttrValue = plusAttrValueList[plusIndex]
                        PlayerControl.CalcAttrDict_Type(plusAttrID, plusAttrValue, allAttrList)
                        #GameWorld.DebugLog("    装备强化: itemID=%s,plusAttrID=%s, plusAttrValue=%s, %s" % (itemID, plusAttrID, plusAttrValue, allAttrList))
            # 传奇属性
            ChEquip.CalcAttr_LegendAttr(curPlayer, curEquip, allAttrList)
            #GameWorld.DebugLog("    装备传奇: itemID=%s,%s" % (itemID, allAttrList))
    # 保存计算值
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Dogz, allAttrList)
    return
def Sync_DogzInfo(curPlayer):
    ## 同步神兽信息
    dogzInfoPack = ChPyNetSendPack.tagMCDogzInfo()
    dogzInfoPack.BuyHelpbattleCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DogzBuyHelpbattleCount)
    NetPackCommon.SendFakePack(curPlayer, dogzInfoPack)
    return
def Sync_DogzHelpbattleState(curPlayer, dogzID, batteState):
    ## 同步神兽助战状态
    helpbattleState = ChPyNetSendPack.tagMCDogzHelpbattleState()
    helpbattleState.DogzID = dogzID
    helpbattleState.BatteState = 1 if batteState else 0
    NetPackCommon.SendFakePack(curPlayer, helpbattleState)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -894,16 +894,15 @@
rptTempItem,        # 临时存放背包 29
rptTreasure,        # 寻宝物品背包 30
rptPet,             # 宠物背包(用物品存储宠物的数据) 31
rptDogzItem,        # 神兽物品背包 32
rptDogzEquip,       # 神兽装备背包 33
rptMax,             # 最大背包类型数量,放在最后一个
) = range(28, 28 + 5)  #C++定义的枚举到27
) = range(28, 28 + 7)  #C++定义的枚举到27
#虚拟背包类型, 从255递减
Def_VPack_TypeList = (
rptRune,            # 符印背包 255
) = range(256 - 1, 256)
#虚拟背包物品信息 ChConfig.Def_VPackItem_Dict
#武器的手持形式
@@ -1220,6 +1219,7 @@
Def_IudetPartSuiteLV = 25  # 部位套装等级 [套装类型1等级, 套装类型2等级, ...]
Def_IudetWingMaterialItemID = 27  # 翅膀精炼材料ID列表
Def_IudetWingMaterialItemCount = 29  # 翅膀精炼材料个数列表
Def_IudetDogzEquipPlus = 31  # 神兽装备强化信息列表 [强化等级, 累计总熟练度]
Def_IudetItemColor = 16  # 物品颜色,如果该值没有就取物品
Def_IudetItemCount = 18  # 物品个数,支持20亿,目前仅特殊转化物品会用到
@@ -1296,7 +1296,7 @@
)=range(5)
# 战斗力模块类型
Def_MFPType_Max = 24
Def_MFPType_Max = 25
ModuleFightPowerTypeList = (
Def_MFPType_Role, # 角色 0
Def_MFPType_Equip, # 装备(基本装备位) 1
@@ -1319,6 +1319,7 @@
Def_MFPType_PetSoul, # 灵宠魂石 18
Def_MFPType_HorseSoul, # 坐骑魂石 19
Def_MFPType_MagicWeaponSoul, # 法宝之魂 20
Def_MFPType_Dogz, # 神兽 21
Def_MFPType_Other, # 其他
#以下暂时没用到,改时再处理
@@ -1666,6 +1667,16 @@
) = range(1, 21)
# 神兽装备位定义
DogzEquipPlace = (
    dogzetHorn,     # 神兽兽角
    dogzetEye,      # 神兽魔眼
    dogzetTooth,    # 神兽獠牙
    dogzetClaw,     # 神兽兽爪
    dogzetScute,    # 神兽鳞甲
) = range(101, 101 + 5)
# 请求进入副本通用检查结果,优先提示的放前面(即索引越大,提示优先级越低)
EnterFBAskResult = (
    EntFBAskRet_OK,             # 0 可以进入