hxp
2023-01-05 d62c2e3c0866e07a52de9166dfd63f9aef6fe9ac
9762 【BT8】【后端】藏宝阁

# Conflicts:
# ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
# ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
6个文件已修改
2个文件已添加
685 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Gubao.py 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -429,6 +429,39 @@
    DWORD        SkinValidTime;    //有效时长秒
};
//古宝表
struct tagGubao
{
    WORD        _GubaoID;    //古宝ID
    BYTE        GubaoQuality;    //古宝品质
    DWORD        UnlockItemID;    //解锁所需物品ID
    BYTE        UnlockItemCnt;    //解锁所需物品数量
    list        GiveSkillIDInfo;    //获得职业技能ID
};
//古宝升星表
struct tagGubaoStar
{
    WORD        _GubaoID;    //古宝ID
    BYTE        _GubaoStar;    //古宝星级
    list        StarUPNeedItemInfo;    //升星所需物品 [[物品ID,个数], ...]
    list        StarAttrTypeList;    //星级属性类型列表
    list        StarAttrValueList;    //星级属性值列表
};
//古宝品质升级表
struct tagGubaoLV
{
    BYTE        _GubaoQuality;    //古宝品质
    BYTE        _GubaoLV;    //古宝等级
    list        LVUPNeedItemInfo;    //升级所需物品 [[物品ID,个数], ...]
    list        LVAttrTypeList;    //等级属性类型列表
    list        LVAttrValueList;    //等级属性值列表
};
//玩家等级表
struct tagPlayerLV
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -20745,6 +20745,118 @@
#------------------------------------------------------
# A3 C7 古宝信息 #tagMCGubaoInfo
class  tagMCGubao(Structure):
    _pack_ = 1
    _fields_ = [
                  ("GubaoID", c_ushort),
                  ("GubaoStar", c_ubyte),
                  ("GubaoLV", 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.GubaoID = 0
        self.GubaoStar = 0
        self.GubaoLV = 0
        return
    def GetLength(self):
        return sizeof(tagMCGubao)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 C7 古宝信息 //tagMCGubaoInfo:
                                GubaoID:%d,
                                GubaoStar:%d,
                                GubaoLV:%d
                                '''\
                                %(
                                self.GubaoID,
                                self.GubaoStar,
                                self.GubaoLV
                                )
        return DumpString
class  tagMCGubaoInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)
    GubaoInfoList = list()    #(vector<tagMCGubao> GubaoInfoList)
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xC7
        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):
            temGubaoInfoList = tagMCGubao()
            _pos = temGubaoInfoList.ReadData(_lpData, _pos)
            self.GubaoInfoList.append(temGubaoInfoList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xC7
        self.Count = 0
        self.GubaoInfoList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Count):
            length += self.GubaoInfoList[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.GubaoInfoList[i].GetLength(), self.GubaoInfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Count:%d,
                                GubaoInfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCGubaoInfo=tagMCGubaoInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGubaoInfo.Head.Cmd,m_NAtagMCGubaoInfo.Head.SubCmd))] = m_NAtagMCGubaoInfo
#------------------------------------------------------
# A3 28 历史累积充值奖励领取记录 #tagMCHistoryReChargeAwardRecord
class  tagMCHistoryReChargeAwardRecord(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -1757,6 +1757,26 @@
PacketSubCMD_7=0x18
PacketCallFunc_7=OnLoveRingUp
;古宝
[PlayerGubao]
ScriptName = Player\PlayerGubao.py
Writer = hxp
Releaser = hxp
RegType = 0
RegisterPackCount = 3
PacketCMD_1=0xB2
PacketSubCMD_1=0x16
PacketCallFunc_1=OnGubaoActivate
PacketCMD_2=0xB2
PacketSubCMD_2=0x17
PacketCallFunc_2=OnGubaoStarUp
PacketCMD_3=0xB2
PacketSubCMD_3=0x18
PacketCallFunc_3=OnGubaoLVUp
;缥缈仙域
[PlayerFairyDomain]
ScriptName = Player\PlayerFairyDomain.py
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -20745,6 +20745,118 @@
#------------------------------------------------------
# A3 C7 古宝信息 #tagMCGubaoInfo
class  tagMCGubao(Structure):
    _pack_ = 1
    _fields_ = [
                  ("GubaoID", c_ushort),
                  ("GubaoStar", c_ubyte),
                  ("GubaoLV", 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.GubaoID = 0
        self.GubaoStar = 0
        self.GubaoLV = 0
        return
    def GetLength(self):
        return sizeof(tagMCGubao)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 C7 古宝信息 //tagMCGubaoInfo:
                                GubaoID:%d,
                                GubaoStar:%d,
                                GubaoLV:%d
                                '''\
                                %(
                                self.GubaoID,
                                self.GubaoStar,
                                self.GubaoLV
                                )
        return DumpString
class  tagMCGubaoInfo(Structure):
    Head = tagHead()
    Count = 0    #(BYTE Count)
    GubaoInfoList = list()    #(vector<tagMCGubao> GubaoInfoList)
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xC7
        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):
            temGubaoInfoList = tagMCGubao()
            _pos = temGubaoInfoList.ReadData(_lpData, _pos)
            self.GubaoInfoList.append(temGubaoInfoList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0xC7
        self.Count = 0
        self.GubaoInfoList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Count):
            length += self.GubaoInfoList[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.GubaoInfoList[i].GetLength(), self.GubaoInfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Count:%d,
                                GubaoInfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Count,
                                "..."
                                )
        return DumpString
m_NAtagMCGubaoInfo=tagMCGubaoInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGubaoInfo.Head.Cmd,m_NAtagMCGubaoInfo.Head.SubCmd))] = m_NAtagMCGubaoInfo
#------------------------------------------------------
# A3 28 历史累积充值奖励领取记录 #tagMCHistoryReChargeAwardRecord
class  tagMCHistoryReChargeAwardRecord(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Gubao.py
New file
@@ -0,0 +1,77 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.Gubao
#
# @todo:古宝
# @author hxp
# @date 2023-01-5
# @version 1.0
#
# 详细描述: 古宝
#
#-------------------------------------------------------------------------------
#"""Version = 2023-01-5 15:30"""
#-------------------------------------------------------------------------------
import GameWorld
import IpyGameDataPY
import PlayerGubao
#---------------------------------------------------------------------
#逻辑实现
## GM命令执行入口
#  @param curPlayer 当前玩家
#  @param msgList 参数列表
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, msgList):
    if not msgList:
        GameWorld.DebugAnswer(curPlayer, "重置古宝: Gubao 0")
        GameWorld.DebugAnswer(curPlayer, "设置古宝: Gubao 古宝ID 等级 星级")
        return
    gubaoIDList = []
    if len(msgList) == 1:
        if msgList[0] == 0:
            ipyDataMgr = IpyGameDataPY.IPY_Data()
            for index in range(ipyDataMgr.GetGubaoCount()):
                ipyData = ipyDataMgr.GetGubaoByIndex(index)
                gubaoID = ipyData.GetGubaoID()
                _, star = PlayerGubao.GetGubaoLVInfo(curPlayer, gubaoID)
                if not star:
                    continue
                gubaoIDList.append(gubaoID)
                PlayerGubao.SetGubaoLVInfo(curPlayer, gubaoID, 0, 0)
            GameWorld.DebugAnswer(curPlayer, "重置古宝OK")
    elif len(msgList) == 3:
        gubaoID, lv, star = msgList
        ipyData = IpyGameDataPY.GetIpyGameData("Gubao", gubaoID)
        if not ipyData:
            GameWorld.DebugAnswer(curPlayer, "不存在该古宝!gubaoID=%s" % gubaoID)
            return
        starIpyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
        if not starIpyData:
            GameWorld.DebugAnswer(curPlayer, "不存在该古宝星级!gubaoID=%s,star=%s" % (gubaoID, star))
            return
        quality = ipyData.GetGubaoQuality()
        lvIpyData = IpyGameDataPY.GetIpyGameData("GubaoLV", quality, lv)
        if not lvIpyData:
            GameWorld.DebugAnswer(curPlayer, "不存在该古宝品质等级!gubaoID=%s,quality=%s,lv=%s" % (gubaoID, quality, lv))
            return
        GameWorld.DebugAnswer(curPlayer, "设置古宝:%s,等级(%s),星(%s)" % (gubaoID, lv, star))
        PlayerGubao.SetGubaoLVInfo(curPlayer, gubaoID, lv, star)
        gubaoIDList.append(gubaoID)
    else:
        return
    PlayerGubao.RefreshGubaoAttr(curPlayer)
    PlayerGubao.Sync_GubaoInfo(curPlayer, gubaoIDList)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -357,6 +357,30 @@
                        ("DWORD", "SkinValidTime", 0),
                        ),
                "Gubao":(
                        ("WORD", "GubaoID", 1),
                        ("BYTE", "GubaoQuality", 0),
                        ("DWORD", "UnlockItemID", 0),
                        ("BYTE", "UnlockItemCnt", 0),
                        ("list", "GiveSkillIDInfo", 0),
                        ),
                "GubaoStar":(
                        ("WORD", "GubaoID", 1),
                        ("BYTE", "GubaoStar", 1),
                        ("list", "StarUPNeedItemInfo", 0),
                        ("list", "StarAttrTypeList", 0),
                        ("list", "StarAttrValueList", 0),
                        ),
                "GubaoLV":(
                        ("BYTE", "GubaoQuality", 1),
                        ("BYTE", "GubaoLV", 1),
                        ("list", "LVUPNeedItemInfo", 0),
                        ("list", "LVAttrTypeList", 0),
                        ("list", "LVAttrValueList", 0),
                        ),
                "PlayerLV":(
                        ("WORD", "LV", 1),
                        ("DWORD", "ExpPoint", 0),
@@ -2719,6 +2743,57 @@
    def GetInitFightPower(self): return self.InitFightPower # 皮肤额外战力
    def GetHorseID(self): return self.HorseID # 对应坐骑ID
    def GetSkinValidTime(self): return self.SkinValidTime # 有效时长秒
# 古宝表
class IPY_Gubao():
    def __init__(self):
        self.GubaoID = 0
        self.GubaoQuality = 0
        self.UnlockItemID = 0
        self.UnlockItemCnt = 0
        self.GiveSkillIDInfo = []
        return
    def GetGubaoID(self): return self.GubaoID # 古宝ID
    def GetGubaoQuality(self): return self.GubaoQuality # 古宝品质
    def GetUnlockItemID(self): return self.UnlockItemID # 解锁所需物品ID
    def GetUnlockItemCnt(self): return self.UnlockItemCnt # 解锁所需物品数量
    def GetGiveSkillIDInfo(self): return self.GiveSkillIDInfo # 获得职业技能ID
# 古宝升星表
class IPY_GubaoStar():
    def __init__(self):
        self.GubaoID = 0
        self.GubaoStar = 0
        self.StarUPNeedItemInfo = []
        self.StarAttrTypeList = []
        self.StarAttrValueList = []
        return
    def GetGubaoID(self): return self.GubaoID # 古宝ID
    def GetGubaoStar(self): return self.GubaoStar # 古宝星级
    def GetStarUPNeedItemInfo(self): return self.StarUPNeedItemInfo # 升星所需物品 [[物品ID,个数], ...]
    def GetStarAttrTypeList(self): return self.StarAttrTypeList # 星级属性类型列表
    def GetStarAttrValueList(self): return self.StarAttrValueList # 星级属性值列表
# 古宝品质升级表
class IPY_GubaoLV():
    def __init__(self):
        self.GubaoQuality = 0
        self.GubaoLV = 0
        self.LVUPNeedItemInfo = []
        self.LVAttrTypeList = []
        self.LVAttrValueList = []
        return
    def GetGubaoQuality(self): return self.GubaoQuality # 古宝品质
    def GetGubaoLV(self): return self.GubaoLV # 古宝等级
    def GetLVUPNeedItemInfo(self): return self.LVUPNeedItemInfo # 升级所需物品 [[物品ID,个数], ...]
    def GetLVAttrTypeList(self): return self.LVAttrTypeList # 等级属性类型列表
    def GetLVAttrValueList(self): return self.LVAttrValueList # 等级属性值列表
# 玩家等级表
class IPY_PlayerLV():
@@ -6339,6 +6414,12 @@
        self.ipyHorseTrainLen = len(self.ipyHorseTrainCache)
        self.ipyHorseSkinPlusCache = self.__LoadFileData("HorseSkinPlus", IPY_HorseSkinPlus)
        self.ipyHorseSkinPlusLen = len(self.ipyHorseSkinPlusCache)
        self.ipyGubaoCache = self.__LoadFileData("Gubao", IPY_Gubao)
        self.ipyGubaoLen = len(self.ipyGubaoCache)
        self.ipyGubaoStarCache = self.__LoadFileData("GubaoStar", IPY_GubaoStar)
        self.ipyGubaoStarLen = len(self.ipyGubaoStarCache)
        self.ipyGubaoLVCache = self.__LoadFileData("GubaoLV", IPY_GubaoLV)
        self.ipyGubaoLVLen = len(self.ipyGubaoLVCache)
        self.ipyPlayerLVCache = self.__LoadFileData("PlayerLV", IPY_PlayerLV)
        self.ipyPlayerLVLen = len(self.ipyPlayerLVCache)
        self.ipySpecMapPlayerAttrFormatCache = self.__LoadFileData("SpecMapPlayerAttrFormat", IPY_SpecMapPlayerAttrFormat)
@@ -6917,6 +6998,12 @@
    def GetHorseTrainByIndex(self, index): return self.ipyHorseTrainCache[index]
    def GetHorseSkinPlusCount(self): return self.ipyHorseSkinPlusLen
    def GetHorseSkinPlusByIndex(self, index): return self.ipyHorseSkinPlusCache[index]
    def GetGubaoCount(self): return self.ipyGubaoLen
    def GetGubaoByIndex(self, index): return self.ipyGubaoCache[index]
    def GetGubaoStarCount(self): return self.ipyGubaoStarLen
    def GetGubaoStarByIndex(self, index): return self.ipyGubaoStarCache[index]
    def GetGubaoLVCount(self): return self.ipyGubaoLVLen
    def GetGubaoLVByIndex(self, index): return self.ipyGubaoLVCache[index]
    def GetPlayerLVCount(self): return self.ipyPlayerLVLen
    def GetPlayerLVByIndex(self, index): return self.ipyPlayerLVCache[index]
    def GetSpecMapPlayerAttrFormatCount(self): return self.ipySpecMapPlayerAttrFormatLen
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -144,6 +144,7 @@
import PlayerFB
import PlayerFaQi
import SkillShell
import PlayerGubao
import PlayerLianTi
import PlayerYinji
import PlayerLove
@@ -910,6 +911,7 @@
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RealLoginOK, 1)
    GameWorld.Log("MapServer->DoPlayerRealLoginOK", curPlayer.GetPlayerID())
    
    PlayerGubao.OnPlayerLogin(curPlayer)
    # 上线查询一次充值订单
    curPlayer.SendDBQueryRecharge()
    
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
New file
@@ -0,0 +1,242 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Player.PlayerGubao
#
# @todo:古宝系统
# @author hxp
# @date 2023-01-05
# @version 1.0
#
# 详细描述: 古宝系统
#
#-------------------------------------------------------------------------------
#"""Version = 2023-01-05 15:30"""
#-------------------------------------------------------------------------------
import GameWorld
import ItemCommon
import SkillCommon
import PlayerControl
import IpyGameDataPY
import ChPyNetSendPack
import NetPackCommon
import IPY_GameWorld
import ChConfig
def GetGubaoLVInfo(curPlayer, gubaoID):
    lvInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoLVInfo % gubaoID)
    lv = lvInfo / 100
    star = lvInfo % 100
    return lv, star
def SetGubaoLVInfo(curPlayer, gubaoID, lv, star):
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoLVInfo % gubaoID, lv * 100 + star)
    return
def OnPlayerLogin(curPlayer):
    Sync_GubaoInfo(curPlayer)
    return
#// B2 16 古宝激活 #tagCMGubaoActivate
#
#struct    tagCMGubaoActivate
#{
#    tagHead         Head;
#    WORD        GubaoID;
#};
def OnGubaoActivate(index, curPackData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    gubaoID = curPackData.GubaoID
    ipyData = IpyGameDataPY.GetIpyGameData("Gubao", gubaoID)
    if not ipyData:
        return
    needItemID = ipyData.GetUnlockItemID()
    needItemCnt = ipyData.GetUnlockItemCnt()
    if not needItemID or not needItemCnt:
        return
    lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
    if lv or star:
        GameWorld.DebugLog("古宝已经激活过! gubaoID=%s" % gubaoID, playerID)
        return
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, needItemCnt)
    if not hasEnough:
        GameWorld.DebugLog("激活古宝道具不足! needItemID=%s,needItemCnt=%s" % (needItemID, needItemCnt), playerID)
        return
    ItemCommon.ReduceItem(curPlayer, itemPack, itemList, needItemCnt, False, "Gubao")
    lv, star = 1, 1
    SetGubaoLVInfo(curPlayer, gubaoID, lv, star)
    GameWorld.Log("古宝激活成功! gubaoID=%s" % gubaoID, playerID)
    giveSkillIDInfo = ipyData.GetGiveSkillIDInfo()
    if giveSkillIDInfo:
        SkillCommon.GivePlayerSkillByJobSkill(curPlayer, giveSkillIDInfo)
    RefreshGubaoAttr(curPlayer)
    Sync_GubaoInfo(curPlayer, [gubaoID])
    return
#// B2 17 古宝升星 #tagCMGubaoStarUp
#
#struct    tagCMGubaoStarUp
#{
#    tagHead         Head;
#    WORD        GubaoID;
#};
def OnGubaoStarUp(index, curPackData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    gubaoID = curPackData.GubaoID
    lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
    if not star:
        GameWorld.DebugLog("古宝未激活,无法升星! gubaoID=%s" % gubaoID, playerID)
        return
    if not IpyGameDataPY.GetIpyGameDataNotLog("GubaoStar", gubaoID, star + 1):
        GameWorld.DebugLog("古宝已满星! gubaoID=%s,star=%s" % (gubaoID, star), playerID)
        return
    ipyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
    if not ipyData:
        return
    needItemList = ipyData.GetStarUPNeedItemInfo()
    if not needItemList:
        return
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
    if lackItemDict:
        GameWorld.DebugLog("古宝升星所需物品不足! star=%s,needItemList=%s,lackItemDict=%s" % (star, needItemList, lackItemDict), playerID)
        return
    #扣消耗
    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")
    updStar = star + 1
    SetGubaoLVInfo(curPlayer, gubaoID, lv, updStar)
    GameWorld.Log("古宝升星: gubaoID=%s,updStar=%s" % (gubaoID, updStar), playerID)
    RefreshGubaoAttr(curPlayer)
    Sync_GubaoInfo(curPlayer, [gubaoID])
    return
#// B2 18 古宝升级 #tagCMGubaoLVUp
#
#struct    tagCMGubaoLVUp
#{
#    tagHead         Head;
#    WORD        GubaoID;
#};
def OnGubaoLVUp(index, curPackData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    gubaoID = curPackData.GubaoID
    lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
    if not star:
        GameWorld.DebugLog("古宝未激活,无法升级! gubaoID=%s" % gubaoID, playerID)
        return
    ipyData = IpyGameDataPY.GetIpyGameData("Gubao", gubaoID)
    if not ipyData:
        return
    quality = ipyData.GetGubaoQuality()
    if not IpyGameDataPY.GetIpyGameDataNotLog("GubaoLV", quality, lv + 1):
        GameWorld.DebugLog("古宝已满级! gubaoID=%s,quality=%s,lv=%s" % (gubaoID, quality, lv), playerID)
        return
    lvIpyData = IpyGameDataPY.GetIpyGameData("GubaoLV", quality, lv)
    if not lvIpyData:
        return
    needItemList = lvIpyData.GetLVUPNeedItemInfo()
    if not needItemList:
        return
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
    if lackItemDict:
        GameWorld.DebugLog("古宝升级所需物品不足! quality=%s,lv=%s,needItemList=%s,lackItemDict=%s"
                           % (quality, lv, needItemList, lackItemDict), playerID)
        return
    #扣消耗
    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")
    updLV = lv + 1
    SetGubaoLVInfo(curPlayer, gubaoID, updLV, star)
    GameWorld.Log("古宝升级: gubaoID=%s,quality=%s,updLV=%s" % (gubaoID, quality, updLV), playerID)
    RefreshGubaoAttr(curPlayer)
    Sync_GubaoInfo(curPlayer, [gubaoID])
    return
def RefreshGubaoAttr(curPlayer):
    CalcGubaoAttr(curPlayer)
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
    return
def CalcGubaoAttr(curPlayer):
    allAttrList = [{} for _ in range(4)]
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in xrange(ipyDataMgr.GetGubaoCount()):
        ipyData = ipyDataMgr.GetGubaoByIndex(index)
        gubaoID = ipyData.GetGubaoID()
        lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
        if not star:
            continue
        quality = ipyData.GetGubaoQuality()
        lvIpyData = IpyGameDataPY.GetIpyGameData("GubaoLV", quality, lv)
        if lvIpyData:
            lvAttrTypeList = lvIpyData.GetLVAttrTypeList()
            lvAttrValueList = lvIpyData.GetLVAttrValueList()
            for i, attrID in enumerate(lvAttrTypeList):
                attrValue = lvAttrValueList[i]
                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
        starIpyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
        if starIpyData:
            starAttrTypeList = starIpyData.GetStarAttrTypeList()
            starAttrValueList = starIpyData.GetStarAttrValueList()
            for i, attrID in enumerate(starAttrTypeList):
                attrValue = starAttrValueList[i]
                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
    # 保存计算值
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Gubao, allAttrList)
    return
def Sync_GubaoInfo(curPlayer, gubaoIDList=None):
    if gubaoIDList == None:
        syncIDList = []
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in range(ipyDataMgr.GetGubaoCount()):
            ipyData = ipyDataMgr.GetGubaoByIndex(index)
            syncIDList.append(ipyData.GetGubaoID())
    else:
        syncIDList = gubaoIDList
    gubaoInfoList = []
    for gubaoID in syncIDList:
        lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
        if not lv and not star and gubaoIDList == None:
            # 没有指定时只同步激活的
            continue
        gubao = ChPyNetSendPack.tagMCGubao()
        gubao.GubaoID = gubaoID
        gubao.GubaoLV = lv
        gubao.GubaoStar = star
        gubaoInfoList.append(gubao)
    if not gubaoInfoList:
        return
    clientPack = ChPyNetSendPack.tagMCGubaoInfo()
    clientPack.GubaoInfoList = gubaoInfoList
    clientPack.Count = len(clientPack.GubaoInfoList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return