From a1f053eb420898b323a18b9e260aaec34af2992a Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期日, 08 十月 2023 14:49:30 +0800
Subject: [PATCH] 9896 【BT0.1】【主干】坐骑、灵宠、称号升星

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py        |   53 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py             |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py             |  156 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py         |  216 ++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py      |   93 ++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                  |  156 +++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                              |  216 ++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                     |   24 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py       |   29 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py           |   87 ++++
 PySysDB/PySysDBPY.h                                                                            |   33 +
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                  |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDienstgrad.py |   98 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                |   17 
 14 files changed, 1,173 insertions(+), 7 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 1e47284..dfe9400 100644
--- a/PySysDB/PySysDBPY.h
+++ b/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
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 04f4a00..11c4858 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/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):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 46c327c..0f37d31 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/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):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 8977ad8..15c7437 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/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  # 骑宠觉醒外观索引
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 625f7a3..56d1cca 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 3cd2686..9433b07 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/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:"称号星级",
                  }
 #-------------------------------------------------------------------------------
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 04f4a00..11c4858 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 46c327c..0f37d31 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py
index c914e61..df771fc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py
+++ b/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:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 56c64be..9c78e57 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDienstgrad.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDienstgrad.py
index 8348670..7643d37 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDienstgrad.py
+++ b/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
\ No newline at end of file
+    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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
index e9da8fd..660a45f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
index bb6fab2..0e5c0d2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
+++ b/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 = []
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 8977ad8..15c7437 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/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  # 骑宠觉醒外观索引

--
Gitblit v1.8.0