hxp
2023-10-08 a1f053eb420898b323a18b9e260aaec34af2992a
9896 【BT0.1】【主干】坐骑、灵宠、称号升星
14个文件已修改
1180 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDienstgrad.py 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -10,6 +10,17 @@
    list        Skills;        //被动技能
};
//称号升星表
struct tagTitleStarUp
{
    DWORD        _TitleID;    //称号NPCID
    BYTE        _TitleStar;    //称号星级
    list        StarUpNeedItemList;    //升下一星所需道具 [[物品ID,个数], ...]
    list        StarAttrType;    //累计总属性类型
    list        StarAttrValue;    //累计总属性值
};
//灵根表 #tagRolePoint
struct    tagRolePoint
@@ -339,6 +350,17 @@
    DWORD        InitFightPower;    //初始战力
};
//灵宠升星表
struct tagPetStarUp
{
    DWORD        _PetNPCID;    //灵兽NPCID
    BYTE        _PetStar;    //灵兽星级
    list        StarUpNeedItemList;    //升下一星所需道具 [[物品ID,个数], ...]
    list        StarAttrType;    //累计总属性类型
    list        StarAttrValue;    //累计总属性值
};
//灵宠培养表
struct tagPetTrain
@@ -451,6 +473,17 @@
    BYTE        Quality;    //坐骑品质
};
//坐骑升星表
struct tagHorseStarUp
{
    DWORD        _HorseID;    //坐骑ID
    BYTE        _HorseStar;    //坐骑星级
    list        StarUpNeedItemList;    //升下一星所需道具 [[物品ID,个数], ...]
    list        StarAttrType;    //累计总属性类型
    list        StarAttrValue;    //累计总属性值
};
//古宝表
struct tagGubao
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -11954,6 +11954,58 @@
#------------------------------------------------------
# A5 35 坐骑升星 #tagCMHorseStarUp
class  tagCMHorseStarUp(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("HorseID", c_int),    #坐骑ID,对应坐骑表ID
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0x35
        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 = 0x35
        self.HorseID = 0
        return
    def GetLength(self):
        return sizeof(tagCMHorseStarUp)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 35 坐骑升星 //tagCMHorseStarUp:
                                Cmd:%s,
                                SubCmd:%s,
                                HorseID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.HorseID
                                )
        return DumpString
m_NAtagCMHorseStarUp=tagCMHorseStarUp()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMHorseStarUp.Cmd,m_NAtagCMHorseStarUp.SubCmd))] = m_NAtagCMHorseStarUp
#------------------------------------------------------
# A5 31 坐骑培养 #tagCMHorseTrain
class  tagCMHorseTrain(Structure):
@@ -13425,6 +13477,58 @@
#------------------------------------------------------
# A5 36 称号升星 #tagCMTitleStarUp
class  tagCMTitleStarUp(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("TitleID", c_int),    #称号ID
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0x36
        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 = 0x36
        self.TitleID = 0
        return
    def GetLength(self):
        return sizeof(tagCMTitleStarUp)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 36 称号升星 //tagCMTitleStarUp:
                                Cmd:%s,
                                SubCmd:%s,
                                TitleID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.TitleID
                                )
        return DumpString
m_NAtagCMTitleStarUp=tagCMTitleStarUp()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMTitleStarUp.Cmd,m_NAtagCMTitleStarUp.SubCmd))] = m_NAtagCMTitleStarUp
#------------------------------------------------------
# A5 11 试用首充武器 #tagCMTryFirstGoldItem
class  tagCMTryFirstGoldItem(Structure):
@@ -14366,6 +14470,58 @@
#------------------------------------------------------
# A7 06 宠物升星 #tagCMPetStarUp
class  tagCMPetStarUp(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("PetItemIndex", c_ubyte),    #宠物数据背包索引
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA7
        self.SubCmd = 0x06
        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 = 0xA7
        self.SubCmd = 0x06
        self.PetItemIndex = 0
        return
    def GetLength(self):
        return sizeof(tagCMPetStarUp)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A7 06 宠物升星 //tagCMPetStarUp:
                                Cmd:%s,
                                SubCmd:%s,
                                PetItemIndex:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.PetItemIndex
                                )
        return DumpString
m_NAtagCMPetStarUp=tagCMPetStarUp()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMPetStarUp.Cmd,m_NAtagCMPetStarUp.SubCmd))] = m_NAtagCMPetStarUp
#------------------------------------------------------
# A7 05 宠物培养 #tagCMPetTrain
class  tagCMPetTrain(Structure):
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -21821,6 +21821,114 @@
#------------------------------------------------------
# A3 CD 坐骑星级信息 #tagMCHorseStarInfo
class  tagMCHorseStar(Structure):
    _pack_ = 1
    _fields_ = [
                  ("HorseID", c_int),    # 坐骑表ID
                  ("Star", c_ubyte),    # 星级
                  ]
    def __init__(self):
        self.Clear()
        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.HorseID = 0
        self.Star = 0
        return
    def GetLength(self):
        return sizeof(tagMCHorseStar)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 CD 坐骑星级信息 //tagMCHorseStarInfo:
                                HorseID:%d,
                                Star:%d
                                '''\
                                %(
                                self.HorseID,
                                self.Star
                                )
        return DumpString
class  tagMCHorseStarInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)
    HorseStarList = list()    #(vector<tagMCHorseStar> HorseStarList)
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xCD
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Count):
            temHorseStarList = tagMCHorseStar()
            _pos = temHorseStarList.ReadData(_lpData, _pos)
            self.HorseStarList.append(temHorseStarList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xCD
        self.Count = 0
        self.HorseStarList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Count):
            length += self.HorseStarList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Count)
        for i in range(self.Count):
            data = CommFunc.WriteString(data, self.HorseStarList[i].GetLength(), self.HorseStarList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Count:%d,
                                HorseStarList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCHorseStarInfo=tagMCHorseStarInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCHorseStarInfo.Head.Cmd,m_NAtagMCHorseStarInfo.Head.SubCmd))] = m_NAtagMCHorseStarInfo
#------------------------------------------------------
# A3 38 投资理财信息 #tagMCInvestInfo
class  tagMCInvestInfo(Structure):
@@ -24952,6 +25060,114 @@
#------------------------------------------------------
# A3 CE 称号星级信息 #tagMCTitleStarInfo
class  tagMCTitleStar(Structure):
    _pack_ = 1
    _fields_ = [
                  ("TitleID", c_int),    # 称号ID
                  ("Star", c_ubyte),    # 星级
                  ]
    def __init__(self):
        self.Clear()
        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.TitleID = 0
        self.Star = 0
        return
    def GetLength(self):
        return sizeof(tagMCTitleStar)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 CE 称号星级信息 //tagMCTitleStarInfo:
                                TitleID:%d,
                                Star:%d
                                '''\
                                %(
                                self.TitleID,
                                self.Star
                                )
        return DumpString
class  tagMCTitleStarInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)
    TitleStarList = list()    #(vector<tagMCTitleStar> TitleStarList)
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xCE
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Count):
            temTitleStarList = tagMCTitleStar()
            _pos = temTitleStarList.ReadData(_lpData, _pos)
            self.TitleStarList.append(temTitleStarList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xCE
        self.Count = 0
        self.TitleStarList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Count):
            length += self.TitleStarList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Count)
        for i in range(self.Count):
            data = CommFunc.WriteString(data, self.TitleStarList[i].GetLength(), self.TitleStarList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Count:%d,
                                TitleStarList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCTitleStarInfo=tagMCTitleStarInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTitleStarInfo.Head.Cmd,m_NAtagMCTitleStarInfo.Head.SubCmd))] = m_NAtagMCTitleStarInfo
#------------------------------------------------------
# A3 56 通天令信息 #tagMCTongTianLingInfo
class  tagMCTongTianLingInfo(Structure):
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1582,6 +1582,7 @@
Def_IudetPet_State = 204  # 当前状态, 对应 Def_PetStateList
Def_IudetPet_QualityLV = 206  # 品质
Def_IudetPet_Exp = 208  # 经验
Def_IudetPet_Star = 210  # 星级
Def_IudetPet_Skill = 201  # 技能列表
Def_IudetHorsePetSkinIndex = 210  # 骑宠觉醒外观索引
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -52,7 +52,7 @@
Writer = wdb
Releaser = wdb
RegType = 0
RegisterPackCount = 6
RegisterPackCount = 7
PacketCMD_1=0xA5
PacketSubCMD_1=0x01
@@ -77,6 +77,10 @@
PacketCMD_6=0xA5
PacketSubCMD_6=0x31
PacketCallFunc_6=OnHorseTrain
PacketCMD_7=0xA5
PacketSubCMD_7=0x35
PacketCallFunc_7=OnHorseStarUp
;玛雅加强
[EquipPlus]
@@ -241,7 +245,7 @@
Writer = hxp
Releaser = hxp
RegType = 0
RegisterPackCount = 3
RegisterPackCount = 4
PacketCMD_1=0xA7
PacketSubCMD_1=0x02
@@ -255,6 +259,22 @@
PacketSubCMD_3=0x05
PacketCallFunc_3=OnPetTrain
PacketCMD_4=0xA7
PacketSubCMD_4=0x06
PacketCallFunc_4=OnPetStarUp
;称号
[PlayerDienstgrad]
ScriptName = Player\PlayerDienstgrad.py
Writer = hxp
Releaser = hxp
RegType = 0
RegisterPackCount = 1
PacketCMD_1=0xA5
PacketSubCMD_1=0x36
PacketCallFunc_1=OnTitleStarUp
;事件
[EventShell]
ScriptName = Event\EventShell.py
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4024,6 +4024,7 @@
# 坐骑
Def_PDict_HorserLV = "HorserLV"  # 坐骑等级
Def_PDict_HorserStar = "HorserStar_%s"  # 坐骑星级,参数(坐骑ID)
Def_PDict_HorserEatItemCount = "HorserEatItemCount"  # 当前阶已吃培养丹个数
Def_PDict_HorserSkinPlusState = "HorserSkinPlusState%s"  # 坐骑幻化皮肤激活状态,按二进制位存储,每位代表幻化ID是否已激活,支持多值
Def_PDict_HorserSkinEndTime = "HorserSkinEndTime_%s"  # 坐骑幻化皮肤激活结束时间戳,仅针对非永久的幻化皮肤
@@ -4033,6 +4034,10 @@
#骑宠觉醒
Def_PDict_HorsePetSkinData = "HorsePetSkinData%d_%s"  #觉醒等级*100+外观索引  参数(类型,关联ID) 1-坐骑 2-灵宠
Def_PDict_HorsePetSkinExp = "HorsePetSkinExp%d_%s"  #经验  参数(类型,关联ID) 1-坐骑 2-灵宠
# 称号
Def_PDict_TitleStar = "TitleStar_%s"  # 称号星级,参数(称号ID)
# 符印
Def_PDict_Rune_HoleOpenState = "Rune_HoleOpenState"  # 符印解锁状态
Def_PDict_Rune_Data = "Rune_Data_%s"  # 符印镶嵌数据, 参数(第几孔)
@@ -4789,7 +4794,10 @@
Def_CalcAttrFunc_LingQiEnchant, # 灵器附魔 54
Def_CalcAttrFunc_Gubao, # 古宝 55
Def_CalcAttrFunc_Shentong, # 神通 56
) = range(57)
Def_CalcAttrFunc_HorseStar, # 坐骑星级 57
Def_CalcAttrFunc_PetStar, # 灵宠星级 58
Def_CalcAttrFunc_TitleStar, # 称号星级 59
) = range(60)
# 技能功能点列表  - 默认不算战力,不享受百分比加成,技能功能点暂时配置,之后优化技能属性逻辑后可去掉
CalcAttrFuncSkillList = [Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_DogzBattleSkill]
@@ -4810,9 +4818,9 @@
                            ShareDefine.Def_MFPType_LingQi:[Def_CalcAttrFunc_LingQi, Def_CalcAttrFunc_LingQiAttr, Def_CalcAttrFunc_LingQiJingLianAttr, Def_CalcAttrFunc_GuardTarin, 
                                                            Def_CalcAttrFunc_WingTarin, Def_CalcAttrFunc_PeerlessWeaponTrain, Def_CalcAttrFunc_PeerlessWeapon2Train],
                            ShareDefine.Def_MFPType_Wash:[Def_CalcAttrFunc_Wash],
                            ShareDefine.Def_MFPType_Pet:[Def_CalcAttrFunc_Pet, Def_CalcAttrFunc_PetSign, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_PetSkin, Def_CalcAttrFunc_PetTarin],
                            ShareDefine.Def_MFPType_Pet:[Def_CalcAttrFunc_Pet, Def_CalcAttrFunc_PetSign, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_PetSkin, Def_CalcAttrFunc_PetTarin, Def_CalcAttrFunc_PetStar],
                            ShareDefine.Def_MFPType_PetSoul:[Def_CalcAttrFunc_PetSoul],
                            ShareDefine.Def_MFPType_Horse:[Def_CalcAttrFunc_Horse, Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_HorseSkin, Def_CalcAttrFunc_HorseTarin],
                            ShareDefine.Def_MFPType_Horse:[Def_CalcAttrFunc_Horse, Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_HorseSkin, Def_CalcAttrFunc_HorseTarin, Def_CalcAttrFunc_HorseStar],
                            ShareDefine.Def_MFPType_HorseSoul:[Def_CalcAttrFunc_HorseSoul],
                            ShareDefine.Def_MFPType_FaQi:[Def_CalcAttrFunc_FaQi],
                            ShareDefine.Def_MFPType_Love:[Def_CalcAttrFunc_LoveRing, Def_CalcAttrFunc_LoveRingCouple],
@@ -4820,7 +4828,7 @@
                            ShareDefine.Def_MFPType_LianTi:[Def_CalcAttrFunc_LianTi],
                            ShareDefine.Def_MFPType_Prestige:[Def_CalcAttrFunc_Prestige],
                            ShareDefine.Def_MFPType_GodWeapon:[Def_CalcAttrFunc_GodWeapon],
                            ShareDefine.Def_MFPType_Dienstgrad:[Def_CalcAttrFunc_Dienstgrad],
                            ShareDefine.Def_MFPType_Dienstgrad:[Def_CalcAttrFunc_Dienstgrad, Def_CalcAttrFunc_TitleStar],
                            ShareDefine.Def_MFPType_Rune:[Def_CalcAttrFunc_Rune],
                            ShareDefine.Def_MFPType_MagicWeapon1:[Def_CalcAttrFunc_MagicWeapon1],
                            ShareDefine.Def_MFPType_MagicWeapon2:[Def_CalcAttrFunc_MagicWeapon2],
@@ -4859,6 +4867,7 @@
                 Def_CalcAttrFunc_WingTarin:"翅膀培养", Def_CalcAttrFunc_PeerlessWeaponTrain:"灭世培养", Def_CalcAttrFunc_PeerlessWeapon2Train:"噬魂培养", Def_CalcAttrFunc_FaQi:"法器",
                 Def_CalcAttrFunc_LoveRing:"情戒基础", Def_CalcAttrFunc_LoveRingCouple:"情戒仙侣", Def_CalcAttrFunc_Charm:"魅力", Def_CalcAttrFunc_LianTi:"炼体",
                 Def_CalcAttrFunc_Enchant:"附魔", Def_CalcAttrFunc_LingQiEnchant:"灵器附魔", Def_CalcAttrFunc_Gubao:"古宝", Def_CalcAttrFunc_Shentong:"神通",
                 Def_CalcAttrFunc_HorseStar:"坐骑星级", Def_CalcAttrFunc_PetStar:"宠物星级", Def_CalcAttrFunc_TitleStar:"称号星级",
                 }
#-------------------------------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -11954,6 +11954,58 @@
#------------------------------------------------------
# A5 35 坐骑升星 #tagCMHorseStarUp
class  tagCMHorseStarUp(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("HorseID", c_int),    #坐骑ID,对应坐骑表ID
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0x35
        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 = 0x35
        self.HorseID = 0
        return
    def GetLength(self):
        return sizeof(tagCMHorseStarUp)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 35 坐骑升星 //tagCMHorseStarUp:
                                Cmd:%s,
                                SubCmd:%s,
                                HorseID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.HorseID
                                )
        return DumpString
m_NAtagCMHorseStarUp=tagCMHorseStarUp()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMHorseStarUp.Cmd,m_NAtagCMHorseStarUp.SubCmd))] = m_NAtagCMHorseStarUp
#------------------------------------------------------
# A5 31 坐骑培养 #tagCMHorseTrain
class  tagCMHorseTrain(Structure):
@@ -13425,6 +13477,58 @@
#------------------------------------------------------
# A5 36 称号升星 #tagCMTitleStarUp
class  tagCMTitleStarUp(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("TitleID", c_int),    #称号ID
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0x36
        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 = 0x36
        self.TitleID = 0
        return
    def GetLength(self):
        return sizeof(tagCMTitleStarUp)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 36 称号升星 //tagCMTitleStarUp:
                                Cmd:%s,
                                SubCmd:%s,
                                TitleID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.TitleID
                                )
        return DumpString
m_NAtagCMTitleStarUp=tagCMTitleStarUp()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMTitleStarUp.Cmd,m_NAtagCMTitleStarUp.SubCmd))] = m_NAtagCMTitleStarUp
#------------------------------------------------------
# A5 11 试用首充武器 #tagCMTryFirstGoldItem
class  tagCMTryFirstGoldItem(Structure):
@@ -14366,6 +14470,58 @@
#------------------------------------------------------
# A7 06 宠物升星 #tagCMPetStarUp
class  tagCMPetStarUp(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("PetItemIndex", c_ubyte),    #宠物数据背包索引
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA7
        self.SubCmd = 0x06
        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 = 0xA7
        self.SubCmd = 0x06
        self.PetItemIndex = 0
        return
    def GetLength(self):
        return sizeof(tagCMPetStarUp)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A7 06 宠物升星 //tagCMPetStarUp:
                                Cmd:%s,
                                SubCmd:%s,
                                PetItemIndex:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.PetItemIndex
                                )
        return DumpString
m_NAtagCMPetStarUp=tagCMPetStarUp()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMPetStarUp.Cmd,m_NAtagCMPetStarUp.SubCmd))] = m_NAtagCMPetStarUp
#------------------------------------------------------
# A7 05 宠物培养 #tagCMPetTrain
class  tagCMPetTrain(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -21821,6 +21821,114 @@
#------------------------------------------------------
# A3 CD 坐骑星级信息 #tagMCHorseStarInfo
class  tagMCHorseStar(Structure):
    _pack_ = 1
    _fields_ = [
                  ("HorseID", c_int),    # 坐骑表ID
                  ("Star", c_ubyte),    # 星级
                  ]
    def __init__(self):
        self.Clear()
        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.HorseID = 0
        self.Star = 0
        return
    def GetLength(self):
        return sizeof(tagMCHorseStar)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 CD 坐骑星级信息 //tagMCHorseStarInfo:
                                HorseID:%d,
                                Star:%d
                                '''\
                                %(
                                self.HorseID,
                                self.Star
                                )
        return DumpString
class  tagMCHorseStarInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)
    HorseStarList = list()    #(vector<tagMCHorseStar> HorseStarList)
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xCD
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Count):
            temHorseStarList = tagMCHorseStar()
            _pos = temHorseStarList.ReadData(_lpData, _pos)
            self.HorseStarList.append(temHorseStarList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xCD
        self.Count = 0
        self.HorseStarList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Count):
            length += self.HorseStarList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Count)
        for i in range(self.Count):
            data = CommFunc.WriteString(data, self.HorseStarList[i].GetLength(), self.HorseStarList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Count:%d,
                                HorseStarList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCHorseStarInfo=tagMCHorseStarInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCHorseStarInfo.Head.Cmd,m_NAtagMCHorseStarInfo.Head.SubCmd))] = m_NAtagMCHorseStarInfo
#------------------------------------------------------
# A3 38 投资理财信息 #tagMCInvestInfo
class  tagMCInvestInfo(Structure):
@@ -24952,6 +25060,114 @@
#------------------------------------------------------
# A3 CE 称号星级信息 #tagMCTitleStarInfo
class  tagMCTitleStar(Structure):
    _pack_ = 1
    _fields_ = [
                  ("TitleID", c_int),    # 称号ID
                  ("Star", c_ubyte),    # 星级
                  ]
    def __init__(self):
        self.Clear()
        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.TitleID = 0
        self.Star = 0
        return
    def GetLength(self):
        return sizeof(tagMCTitleStar)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 CE 称号星级信息 //tagMCTitleStarInfo:
                                TitleID:%d,
                                Star:%d
                                '''\
                                %(
                                self.TitleID,
                                self.Star
                                )
        return DumpString
class  tagMCTitleStarInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)
    TitleStarList = list()    #(vector<tagMCTitleStar> TitleStarList)
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xCE
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Count):
            temTitleStarList = tagMCTitleStar()
            _pos = temTitleStarList.ReadData(_lpData, _pos)
            self.TitleStarList.append(temTitleStarList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xCE
        self.Count = 0
        self.TitleStarList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Count):
            length += self.TitleStarList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Count)
        for i in range(self.Count):
            data = CommFunc.WriteString(data, self.TitleStarList[i].GetLength(), self.TitleStarList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Count:%d,
                                TitleStarList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCTitleStarInfo=tagMCTitleStarInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTitleStarInfo.Head.Cmd,m_NAtagMCTitleStarInfo.Head.SubCmd))] = m_NAtagMCTitleStarInfo
#------------------------------------------------------
# A3 56 通天令信息 #tagMCTongTianLingInfo
class  tagMCTongTianLingInfo(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py
@@ -39,6 +39,7 @@
        GameWorld.DebugAnswer(curPlayer, "全部幻化: Horse skin 1")
        GameWorld.DebugAnswer(curPlayer, "重置幻化: Horse skin 0")
        GameWorld.DebugAnswer(curPlayer, "设置幻化: Horse skin 幻化ID 状态")
        GameWorld.DebugAnswer(curPlayer, "设置星级: Horse star 坐骑ID 星级")
        return
    
    if msgList[0] == "skin":
@@ -60,6 +61,29 @@
        else:
            return
        
    elif msgList[0] == "star":
        horseID = msgList[1] if len(msgList) > 1 else 0
        horseStar = msgList[2] if len(msgList) > 2 else 0
        if not horseID or not horseStar:
            return
        skinID = 0
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()):
            skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index)
            if horseID != skinPlusIpyData.GetHorseID():
                continue
            if PlayerHorse.CheckHorseSkinState(curPlayer, skinPlusIpyData):
                skinID = skinPlusIpyData.GetID()
            break
        if not skinID:
            GameWorld.DebugAnswer(curPlayer, "该坐骑不存在或未激活:horseID=%s" % horseID)
            return
        if not IpyGameDataPY.GetIpyGameData("HorseStarUp", horseID, horseStar):
            GameWorld.DebugAnswer(curPlayer, "不存在该坐骑星级:horseID=%s,star=%s" % (horseID, horseStar))
            return
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserStar % horseID, horseStar)
        GameWorld.DebugAnswer(curPlayer, "设置坐骑星级:horseID=%s,star=%s,skinID=%s" % (horseID, horseStar, skinID))
    elif len(msgList) == 1:
        if msgList[0] == 0:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserLV, 1)
@@ -75,6 +99,11 @@
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinEndTime % skinID, 0)
                GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, skinID, 0)
                
            for index in range(ipyDataMgr.GetHorseCount()):
                ipyData = ipyDataMgr.GetHorseByIndex(index)
                horseID = ipyData.GetHorseID()
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserStar % horseID, 0)
    elif len(msgList) == 2:
        lv, eatItemCount = msgList
        if lv < 1:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -41,6 +41,14 @@
                        ("list", "Skills", 0),
                        ),
                "TitleStarUp":(
                        ("DWORD", "TitleID", 1),
                        ("BYTE", "TitleStar", 1),
                        ("list", "StarUpNeedItemList", 0),
                        ("list", "StarAttrType", 0),
                        ("list", "StarAttrValue", 0),
                        ),
                "RolePoint":(
                        ("BYTE", "AttrID", 1),
                        ("dict", "AddAttrInfoPerPoint", 0),
@@ -290,6 +298,14 @@
                        ("DWORD", "InitFightPower", 0),
                        ),
                "PetStarUp":(
                        ("DWORD", "PetNPCID", 1),
                        ("BYTE", "PetStar", 1),
                        ("list", "StarUpNeedItemList", 0),
                        ("list", "StarAttrType", 0),
                        ("list", "StarAttrValue", 0),
                        ),
                "PetTrain":(
                        ("BYTE", "TrainType", 1),
                        ("BYTE", "TrainLV", 1),
@@ -371,6 +387,14 @@
                        ("DWORD", "HorseID", 1),
                        ("DWORD", "HorseSkinID", 0),
                        ("BYTE", "Quality", 0),
                        ),
                "HorseStarUp":(
                        ("DWORD", "HorseID", 1),
                        ("BYTE", "HorseStar", 1),
                        ("list", "StarUpNeedItemList", 0),
                        ("list", "StarAttrType", 0),
                        ("list", "StarAttrValue", 0),
                        ),
                "Gubao":(
@@ -2160,6 +2184,23 @@
    def GetLightAttribute(self): return self.LightAttribute # 点亮属性值
    def GetSkills(self): return self.Skills # 被动技能
# 称号升星表
class IPY_TitleStarUp():
    def __init__(self):
        self.TitleID = 0
        self.TitleStar = 0
        self.StarUpNeedItemList = []
        self.StarAttrType = []
        self.StarAttrValue = []
        return
    def GetTitleID(self): return self.TitleID # 称号NPCID
    def GetTitleStar(self): return self.TitleStar # 称号星级
    def GetStarUpNeedItemList(self): return self.StarUpNeedItemList # 升下一星所需道具 [[物品ID,个数], ...]
    def GetStarAttrType(self): return self.StarAttrType # 累计总属性类型
    def GetStarAttrValue(self): return self.StarAttrValue # 累计总属性值
# 灵根表
class IPY_RolePoint():
    
@@ -2683,6 +2724,23 @@
    def GetSkillUnLockSys(self): return self.SkillUnLockSys # 灵兽技能解锁提示
    def GetInitFightPower(self): return self.InitFightPower # 初始战力
# 灵宠升星表
class IPY_PetStarUp():
    def __init__(self):
        self.PetNPCID = 0
        self.PetStar = 0
        self.StarUpNeedItemList = []
        self.StarAttrType = []
        self.StarAttrValue = []
        return
    def GetPetNPCID(self): return self.PetNPCID # 灵兽NPCID
    def GetPetStar(self): return self.PetStar # 灵兽星级
    def GetStarUpNeedItemList(self): return self.StarUpNeedItemList # 升下一星所需道具 [[物品ID,个数], ...]
    def GetStarAttrType(self): return self.StarAttrType # 累计总属性类型
    def GetStarAttrValue(self): return self.StarAttrValue # 累计总属性值
# 灵宠培养表
class IPY_PetTrain():
    
@@ -2857,6 +2915,23 @@
    def GetHorseID(self): return self.HorseID # 坐骑ID
    def GetHorseSkinID(self): return self.HorseSkinID # 外观物品ID
    def GetQuality(self): return self.Quality # 坐骑品质
# 坐骑升星表
class IPY_HorseStarUp():
    def __init__(self):
        self.HorseID = 0
        self.HorseStar = 0
        self.StarUpNeedItemList = []
        self.StarAttrType = []
        self.StarAttrValue = []
        return
    def GetHorseID(self): return self.HorseID # 坐骑ID
    def GetHorseStar(self): return self.HorseStar # 坐骑星级
    def GetStarUpNeedItemList(self): return self.StarUpNeedItemList # 升下一星所需道具 [[物品ID,个数], ...]
    def GetStarAttrType(self): return self.StarAttrType # 累计总属性类型
    def GetStarAttrValue(self): return self.StarAttrValue # 累计总属性值
# 古宝表
class IPY_Gubao():
@@ -6599,6 +6674,8 @@
        self.ipyConfigEx = {}
        self.ipyDienstgradCache = self.__LoadFileData("Dienstgrad", IPY_Dienstgrad)
        self.ipyDienstgradLen = len(self.ipyDienstgradCache)
        self.ipyTitleStarUpCache = self.__LoadFileData("TitleStarUp", IPY_TitleStarUp)
        self.ipyTitleStarUpLen = len(self.ipyTitleStarUpCache)
        self.ipyRolePointCache = self.__LoadFileData("RolePoint", IPY_RolePoint)
        self.ipyRolePointLen = len(self.ipyRolePointCache)
        self.ipyLingQiAttrCache = self.__LoadFileData("LingQiAttr", IPY_LingQiAttr)
@@ -6649,6 +6726,8 @@
        self.ipyAttrFruitLen = len(self.ipyAttrFruitCache)
        self.ipyPetInfoCache = self.__LoadFileData("PetInfo", IPY_PetInfo)
        self.ipyPetInfoLen = len(self.ipyPetInfoCache)
        self.ipyPetStarUpCache = self.__LoadFileData("PetStarUp", IPY_PetStarUp)
        self.ipyPetStarUpLen = len(self.ipyPetStarUpCache)
        self.ipyPetTrainCache = self.__LoadFileData("PetTrain", IPY_PetTrain)
        self.ipyPetTrainLen = len(self.ipyPetTrainCache)
        self.ipyEquipDecomposeCache = self.__LoadFileData("EquipDecompose", IPY_EquipDecompose)
@@ -6667,6 +6746,8 @@
        self.ipyHorseSkinPlusLen = len(self.ipyHorseSkinPlusCache)
        self.ipyHorseCache = self.__LoadFileData("Horse", IPY_Horse)
        self.ipyHorseLen = len(self.ipyHorseCache)
        self.ipyHorseStarUpCache = self.__LoadFileData("HorseStarUp", IPY_HorseStarUp)
        self.ipyHorseStarUpLen = len(self.ipyHorseStarUpCache)
        self.ipyGubaoCache = self.__LoadFileData("Gubao", IPY_Gubao)
        self.ipyGubaoLen = len(self.ipyGubaoCache)
        self.ipyGubaoStarCache = self.__LoadFileData("GubaoStar", IPY_GubaoStar)
@@ -7201,6 +7282,8 @@
    
    def GetDienstgradCount(self): return self.ipyDienstgradLen
    def GetDienstgradByIndex(self, index): return self.ipyDienstgradCache[index]
    def GetTitleStarUpCount(self): return self.ipyTitleStarUpLen
    def GetTitleStarUpByIndex(self, index): return self.ipyTitleStarUpCache[index]
    def GetRolePointCount(self): return self.ipyRolePointLen
    def GetRolePointByIndex(self, index): return self.ipyRolePointCache[index]
    def GetLingQiAttrCount(self): return self.ipyLingQiAttrLen
@@ -7251,6 +7334,8 @@
    def GetAttrFruitByIndex(self, index): return self.ipyAttrFruitCache[index]
    def GetPetInfoCount(self): return self.ipyPetInfoLen
    def GetPetInfoByIndex(self, index): return self.ipyPetInfoCache[index]
    def GetPetStarUpCount(self): return self.ipyPetStarUpLen
    def GetPetStarUpByIndex(self, index): return self.ipyPetStarUpCache[index]
    def GetPetTrainCount(self): return self.ipyPetTrainLen
    def GetPetTrainByIndex(self, index): return self.ipyPetTrainCache[index]
    def GetEquipDecomposeCount(self): return self.ipyEquipDecomposeLen
@@ -7269,6 +7354,8 @@
    def GetHorseSkinPlusByIndex(self, index): return self.ipyHorseSkinPlusCache[index]
    def GetHorseCount(self): return self.ipyHorseLen
    def GetHorseByIndex(self, index): return self.ipyHorseCache[index]
    def GetHorseStarUpCount(self): return self.ipyHorseStarUpLen
    def GetHorseStarUpByIndex(self, index): return self.ipyHorseStarUpCache[index]
    def GetGubaoCount(self): return self.ipyGubaoLen
    def GetGubaoByIndex(self, index): return self.ipyGubaoCache[index]
    def GetGubaoStarCount(self): return self.ipyGubaoStarLen
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDienstgrad.py
@@ -28,6 +28,9 @@
import CrossPlayerData
import GameFuncComm
import ShareDefine
import ChPyNetSendPack
import NetPackCommon
import ItemCommon
import time
#-------------------------------------------------------------
@@ -136,6 +139,10 @@
    CrossPlayerData.OnDienstgradChange(curPlayer, dienstgradID, 1)
    if dienstgradID == IpyGameDataPY.GetFuncCfg("TitleAddPoint"):
        __DoTitleAddPoint(curPlayer)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TitleStar % dienstgradID, 1)
    SyncTitleStarInfo(curPlayer, dienstgradID)
    #重新刷新角色属性
    if isRefreshAttr:
        CalcAllDienstgradAttr(curPlayer)
@@ -393,6 +400,8 @@
    curDienstgradMgr = curPlayer.GetDienstgradManager()
    curDienstgradMgr.Sync_AllDienstgrad()
    curDienstgradMgr.Notify_PlayerChangeDienstgrad(curDienstgradMgr.GetCurGradID())
    SyncTitleStarInfo(curPlayer)
    return
#===============================================================================
# //B2 01 使用称号(有属性不显示场景中) #tagPyCMUseDienstgrad
@@ -447,6 +456,47 @@
        FitOnDienstgrad(index, curGradID)
    else:
        TakeOffDienstgrad(index)
#// A5 36 称号升星 #tagCMTitleStarUp
#
#struct    tagCMTitleStarUp
#{
#    tagHead        Head;
#    DWORD        TitleID;        //称号ID
#};
def OnTitleStarUp(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    titleID = clientData.TitleID
    curStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TitleStar % titleID)
    ipyData = IpyGameDataPY.GetIpyGameData("TitleStarUp", titleID, curStar)
    if not ipyData:
        return
    nextStar = curStar + 1
    nextIpyData = IpyGameDataPY.GetIpyGameData("TitleStarUp", titleID, nextStar)
    needItemList = ipyData.GetStarUpNeedItemList()
    if not needItemList or not nextIpyData:
        GameWorld.DebugLog("称号已满星,无法升星. titleID=%s,curStar=%s" % (titleID, curStar), playerID)
        return
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
    if lackItemDict:
        GameWorld.DebugLog("称号升星所需物品不足! titleID=%s,curStar=%s,needItemList=%s,lackItemDict=%s"
                           % (titleID, curStar, needItemList, lackItemDict), playerID)
        return
    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "TitleStarUp")
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TitleStar % titleID, nextStar)
    GameWorld.DebugLog("称号升星. titleID=%s,curStar=%s,nextStar=%s" % (titleID, curStar, nextStar), playerID)
    CalcAllDienstgradAttr(curPlayer)
    playerControl = PlayerControl.PlayerControl(curPlayer)
    playerControl.RefreshPlayerAttrState()
    SyncTitleStarInfo(curPlayer, titleID)
    return
#-------------------------------------------------------------
## 获取已激活称号列表
@@ -481,6 +531,8 @@
def CalcAllDienstgradAttr(curPlayer):
    # 计算全部称号属性
    allAttrList = [{} for i in range(4)]
    allAttrListStar = [{} for _ in range(4)]
    dienstgradManager = curPlayer.GetDienstgradManager()
    gradCnt = dienstgradManager.GetCount()
    for i in xrange(gradCnt):
@@ -497,8 +549,18 @@
        for i, attrID in enumerate(attrTypeList):
            PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)
            
        curStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TitleStar % curGradID)
        starIpyData = IpyGameDataPY.GetIpyGameData("TitleStarUp", curGradID, curStar)
        if starIpyData:
            starAttrType = starIpyData.GetStarAttrType()
            starAttrValue = starIpyData.GetStarAttrValue()
            for i, attrID in enumerate(starAttrType):
                attrValue = starAttrValue[i]
                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListStar)
    # 保存计算值
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Dienstgrad, allAttrList)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_TitleStar, allAttrListStar)
    return
## 称号每日更新处理
@@ -565,4 +627,38 @@
    for dienstgradID in dienstgradIDList:
        PlayerAddDienstgrad(curPlayer, dienstgradID)
        #PlayerFitOnDienstgrad(curPlayer, dienstgradID)
    return
    return
def SyncTitleStarInfo(curPlayer, titleID=None):
    if titleID > 0:
        syncIDList = [titleID]
    else:
        syncIDList = []
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in range(ipyDataMgr.GetDienstgradCount()):
            ipyData = ipyDataMgr.GetDienstgradByIndex(index)
            syncIDList.append(ipyData.GetID())
    if not syncIDList:
        return
    titleStarList = []
    for titleID in syncIDList:
        curStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TitleStar % titleID)
        if not curStar:
            continue
        starInfo = ChPyNetSendPack.tagMCTitleStar()
        starInfo.Clear()
        starInfo.TitleID = titleID
        starInfo.Star = curStar
        titleStarList.append(starInfo)
    if not titleStarList:
        return
    clientPack = ChPyNetSendPack.tagMCTitleStarInfo()
    clientPack.Clear()
    clientPack.TitleStarList = titleStarList
    clientPack.Count = len(clientPack.TitleStarList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -220,6 +220,11 @@
    GameWorld.Log("坐骑激活成功!activateID=%s,activateState=%s,updActivateState=%s,updSkinEndTime=%s" 
                  % (activateID, activateState, updActivateState, updSkinEndTime), playerID)
    
    horseStar = 1 # 初始星级
    horseID = ipyData.GetHorseID()
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserStar % horseID, horseStar)
    SyncHorseStarInfo(curPlayer, horseID)
    # 刷属性,更新排行榜
    RefreshHorseAttr(curPlayer)
    PlayerControl.WorldNotify(0, "GetMount", [curPlayer.GetName(), ipyData.GetHorseSkinPlusID()])
@@ -403,6 +408,7 @@
    allAttrListHorseSoul = [{} for _ in range(4)]
    allAttrListSkin = [{} for _ in range(4)]
    allAttrListTrain = [{} for _ in range(4)]
    allAttrListStar = [{} for _ in range(4)]
    
    customAttrDictSkin = {}
    
@@ -481,6 +487,20 @@
            for i, attrID in enumerate(attrTypeList):
                attrValue = attrValueList[i]
                qualityAttrDict[attrID] = qualityAttrDict.get(attrID, 0) + attrValue
        #星级
        horseStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserStar % horseID)
        starIpyData = IpyGameDataPY.GetIpyGameData("HorseStarUp", horseID, horseStar)
        if starIpyData:
            starAttrType = starIpyData.GetStarAttrType()
            starAttrValue = starIpyData.GetStarAttrValue()
            for i, attrID in enumerate(starAttrType):
                attrValue = starAttrValue[i]
                if attrID == ShareDefine.Def_Effect_Speed:
                    horseSpeed += attrValue
                    continue
                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListStar)
    customAttrDictSkin["horseSkinQualityAttrInfo"] = horseSkinQualityAttrInfo
    
    # 新培养属性
@@ -533,6 +553,7 @@
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSoul, allAttrListHorseSoul)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSkin, allAttrListSkin, customAttrDict=customAttrDictSkin)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseTarin, allAttrListTrain)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseStar, allAttrListStar)
    return
def GetHorseSkinActCount(curPlayer):
@@ -710,6 +731,44 @@
    RefreshHorseAttr(curPlayer)
    return
#// A5 35 坐骑升星 #tagCMHorseStarUp
#
#struct    tagCMHorseStarUp
#{
#    tagHead        Head;
#    DWORD        HorseID;        //坐骑ID,对应坐骑表ID
#};
def OnHorseStarUp(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    horseID = clientData.HorseID
    horseStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserStar % horseID)
    ipyData = IpyGameDataPY.GetIpyGameData("HorseStarUp", horseID, horseStar)
    if not ipyData:
        return
    nextStar = horseStar + 1
    nextIpyData = IpyGameDataPY.GetIpyGameData("HorseStarUp", horseID, nextStar)
    needItemList = ipyData.GetStarUpNeedItemList()
    if not needItemList or not nextIpyData:
        GameWorld.DebugLog("坐骑已满星,无法升星. horseID=%s,curStar=%s" % (horseID, horseStar), playerID)
        return
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
    if lackItemDict:
        GameWorld.DebugLog("坐骑升星所需物品不足! horseID=%s,curStar=%s,needItemList=%s,lackItemDict=%s"
                           % (horseID, horseStar, needItemList, lackItemDict), playerID)
        return
    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "HorseStarUp")
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserStar % horseID, nextStar)
    GameWorld.DebugLog("坐骑升星. horseID=%s,curStar=%s,nextStar=%s" % (horseID, horseStar, nextStar), playerID)
    RefreshHorseAttr(curPlayer)
    SyncHorseStarInfo(curPlayer, horseID)
    return
def GetHorseTrainTypes():
    return len(IpyGameDataPY.GetFuncEvalCfg("HorseTrain", 1))
@@ -734,6 +793,7 @@
    Sync_HorseClassData(curPlayer)
    SyncHorsePetSkinData(curPlayer)
    SyncHorseSkinTimeInfo(curPlayer)
    SyncHorseStarInfo(curPlayer)
    return
def Sync_HorseClassData(curPlayer):
@@ -967,3 +1027,36 @@
    NetPackCommon.SendFakePack(curPlayer, packData)
    return
def SyncHorseStarInfo(curPlayer, horseID=None):
    if horseID > 0:
        syncIDList = [horseID]
    else:
        syncIDList = []
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in range(ipyDataMgr.GetHorseCount()):
            ipyData = ipyDataMgr.GetHorseByIndex(index)
            syncIDList.append(ipyData.GetHorseID())
    if not syncIDList:
        return
    horseStarList = []
    for horseID in syncIDList:
        horseStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserStar % horseID)
        if not horseStar:
            continue
        starInfo = ChPyNetSendPack.tagMCHorseStar()
        starInfo.Clear()
        starInfo.HorseID = horseID
        starInfo.Star = horseStar
        horseStarList.append(starInfo)
    if not horseStarList:
        return
    clientPack = ChPyNetSendPack.tagMCHorseStarInfo()
    clientPack.Clear()
    clientPack.HorseStarList = horseStarList
    clientPack.Count = len(clientPack.HorseStarList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
@@ -121,6 +121,7 @@
    initClass = petIpyData.GetInitRank() if classlv == -1 else classlv#初始阶级
    newPetItem.SetUserAttr(ShareDefine.Def_IudetPet_ClassLV, max(0, initClass - 1)) #代码里从0开始
    newPetItem.SetUserAttr(ShareDefine.Def_IudetPet_QualityLV, petIpyData.GetQuality()) # 宠物品质
    newPetItem.SetUserAttr(ShareDefine.Def_IudetPet_Star, 1) # 起始1星
    
    
    petSkillList = petIpyData.GetSkillID()
@@ -873,6 +874,7 @@
    skillAttrList = [{} for _ in range(4)]
    allAttrListPetSkin = [{} for _ in range(4)]
    allAttrListTrain = [{} for _ in range(4)]
    allAttrListStar = [{} for _ in range(4)]
    customAttrDictPet = {}
    totalMinAtk, totalMaxAtk, qualityAttrInfo = GetPetAtkValue(curPlayer)
    customAttrDictPet["petQualityAttrInfo"] = qualityAttrInfo
@@ -972,7 +974,19 @@
        if skinIpyData:
            for attrID, attrValue in skinIpyData.GetAttrInfo().items():
                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListPetSkin)
        #星级
        curStar = petItem.GetUserAttr(ShareDefine.Def_IudetPet_Star)
        starIpyData = IpyGameDataPY.GetIpyGameData("PetStarUp", petItemNPCID, curStar)
        if starIpyData:
            starAttrType = starIpyData.GetStarAttrType()
            starAttrValue = starIpyData.GetStarAttrValue()
            for i, attrID in enumerate(starAttrType):
                attrValue = starAttrValue[i]
                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListStar)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSkin, allAttrListPetSkin)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetStar, allAttrListStar)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Pet, fpExTotal)
#    GameWorld.DebugLog("宠物榜NPCID: %s, petDict=%s" % (billPetNPCID, str(billPetDict)))
    return
@@ -1104,6 +1118,45 @@
    RefreshPetItemAddAttr(curPlayer, True)
    return
#// A7 06 宠物升星 #tagCMPetStarUp
#
#struct    tagCMPetStarUp
#{
#    tagHead        Head;
#    BYTE        PetItemIndex;    //宠物数据背包索引
#};
def OnPetStarUp(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    PetItemIndex = clientData.PetItemIndex
    petDataItem = GetPetDataItemByIndex(curPlayer, PetItemIndex)
    if not petDataItem:
        return
    petNPCID = petDataItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
    curStar = petDataItem.GetUserAttr(ShareDefine.Def_IudetPet_Star)
    ipyData = IpyGameDataPY.GetIpyGameData("PetStarUp", petNPCID, curStar)
    if not ipyData:
        return
    nextStar = curStar + 1
    nextIpyData = IpyGameDataPY.GetIpyGameData("PetStarUp", petNPCID, nextStar)
    needItemList = ipyData.GetStarUpNeedItemList()
    if not needItemList or not nextIpyData:
        GameWorld.DebugLog("灵宠已满星,无法升星. petNPCID=%s,curStar=%s" % (petNPCID, curStar), playerID)
        return
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
    if lackItemDict:
        GameWorld.DebugLog("灵宠升星所需物品不足! petNPCID=%s,curStar=%s,needItemList=%s,lackItemDict=%s"
                           % (petNPCID, curStar, needItemList, lackItemDict), playerID)
        return
    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "PetStarUp")
    petDataItem.SetUserAttr(ShareDefine.Def_IudetPet_Star, nextStar)
    GameWorld.DebugLog("灵宠升星. petNPCID=%s,curStar=%s,nextStar=%s" % (petNPCID, curStar, nextStar), playerID)
    RefreshPetItemAddAttr(curPlayer, True)
    return
def Sync_PetTrainData(curPlayer):
    clientPack = ChPyNetSendPack.tagMCPetTrainInfo()
    clientPack.TrainLVList = []
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1582,6 +1582,7 @@
Def_IudetPet_State = 204  # 当前状态, 对应 Def_PetStateList
Def_IudetPet_QualityLV = 206  # 品质
Def_IudetPet_Exp = 208  # 经验
Def_IudetPet_Star = 210  # 星级
Def_IudetPet_Skill = 201  # 技能列表
Def_IudetHorsePetSkinIndex = 210  # 骑宠觉醒外观索引