hxp
2023-01-12 063c37a60dfad1fad8e31ee235e0d69c3ae35481
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
@@ -1,238 +1,382 @@
#!/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 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)
    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
#!/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 PlayerControl
import IpyGameDataPY
import ChPyNetSendPack
import NetPackCommon
import IPY_GameWorld
import PlayerHorse
import PlayerDogz
import PlayerPet
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)
    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:
            starEffIDList = starIpyData.GetStarEffIDList()
            effAttrInfo = {}
            #GameWorld.DebugLog("GubaoStar属性: gubaoID=%s,star=%s,starEffIDList=%s" % (gubaoID, star, starEffIDList))
            for effID in starEffIDList:
                __calcStarEffAttrByID(curPlayer, effID, effAttrInfo)
                #GameWorld.DebugLog("    effID=%s,effAttrInfo=%s" % (effID, effAttrInfo))
            for attrID, attrValue in effAttrInfo.items():
                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
    # 保存计算值
    #GameWorld.DebugLog("古宝属性: %s" % allAttrList)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Gubao, allAttrList)
    return
def __calcStarEffAttrByID(curPlayer, effID, effAttrInfo):
    ''' 计算古宝特殊效果ID对应提升属性
    '''
    ipyData = IpyGameDataPY.GetIpyGameData("GubaoEffAttr", effID)
    if not ipyData:
        return
    effType = ipyData.GetGubaoEffType()
    effCond = ipyData.GetEffCond()
    attrID = ipyData.GetEffAttrID()
    effAttrValue = ipyData.GetEffAttrValue()
    if effAttrValue <= 0:
        return
    #效果类型    类型说明                                                    条件
    # 10    x品质灵宠攻击属性提升x%      x品质
    if effType == 10:
        customAttrDictPet = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Pet)[2]
        petQualityAttrInfo = customAttrDictPet.get("petQualityAttrInfo", {})
        quality = effCond
        #GameWorld.DebugLog("    effID=%s,effType=%s,quality=%s,petQualityAttrInfo=%s" % (effID, effType, quality, petQualityAttrInfo))
        if quality not in petQualityAttrInfo:
            return
        __addStarEffFuncAttr(ipyData, effAttrInfo, petQualityAttrInfo[quality], effAttrValue)
    # 11    灵宠总等级每x级+xx属性                   x级
    elif effType == 11:
        totalPetLV = PlayerPet.GetTotalPetLV(curPlayer)
        addAttrValue = int(totalPetLV / effCond * effAttrValue)
        #GameWorld.DebugLog("    effID=%s,effType=%s,effCond=%s,totalPetLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, totalPetLV, attrID, addAttrValue))
        if attrID > 0 and addAttrValue > 0:
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
    # 12    灵宠每激活x只+xx属性                        x只
    elif effType == 12:
        totalPetCount = PlayerPet.GetTotalPetCount(curPlayer)
        addAttrValue = int(totalPetCount / effCond * effAttrValue)
        #GameWorld.DebugLog("    effID=%s,effType=%s,effCond=%s,totalPetCount=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, totalPetCount, attrID, addAttrValue))
        if attrID > 0 and addAttrValue > 0:
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
    # 13    x品质坐骑幻化属性提升x%      x品质
    elif effType == 13:
        customAttrDictSkin = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSkin)[2]
        horseSkinQualityAttrInfo = customAttrDictSkin.get("horseSkinQualityAttrInfo", {})
        quality = effCond
        #GameWorld.DebugLog("    effID=%s,effType=%s,quality=%s,horseSkinQualityAttrInfo=%s" % (effID, effType, quality, horseSkinQualityAttrInfo))
        if quality not in horseSkinQualityAttrInfo:
            return
        __addStarEffFuncAttr(ipyData, effAttrInfo, horseSkinQualityAttrInfo[quality], effAttrValue)
    # 14    坐骑幻化激活x只+xx属性                   x只
    elif effType == 14:
        horseSkinActCount = PlayerHorse.GetHorseSkinActCount(curPlayer)
        addAttrValue = int(horseSkinActCount / effCond * effAttrValue)
        #GameWorld.DebugLog("    effID=%s,effType=%s,effCond=%s,horseSkinActCount=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, horseSkinActCount, attrID, addAttrValue))
        if attrID > 0 and addAttrValue > 0:
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
    # 15    每培养坐骑x次+xx属性                        x次
    elif effType == 15:
        pass
    #16    x阶装备强化属性提升x%        x阶
    elif effType == 16:
        customAttrDictPlus = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Plus)[2]
        classBaseAttrDictPlus = customAttrDictPlus.get("classBaseAttrDictPlus", {})
        classLV = effCond
        #GameWorld.DebugLog("    effID=%s,effType=%s,classLV=%s,classBaseAttrDictPlus=%s" % (effID, effType, classLV, classBaseAttrDictPlus))
        if classLV not in classBaseAttrDictPlus:
            return
        __addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictPlus[classLV], effAttrValue)
    #17    x阶装备宝石属性提升x%        x阶
    elif effType == 17:
        customAttrDictStone = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Stone)[2]
        classBaseAttrDictStone = customAttrDictStone.get("classBaseAttrDictStone", {})
        classLV = effCond
        #GameWorld.DebugLog("    effID=%s,effType=%s,classLV=%s,classBaseAttrDictStone=%s" % (effID, effType, classLV, classBaseAttrDictStone))
        if classLV not in classBaseAttrDictStone:
            return
        __addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictStone[classLV], effAttrValue)
    #18    x阶装备升星属性提升x%        x阶
    elif effType == 18:
        customAttrDictStar = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Star)[2]
        classBaseAttrDictStar = customAttrDictStar.get("classBaseAttrDictStar", {})
        classLV = effCond
        #GameWorld.DebugLog("    effID=%s,effType=%s,classLV=%s,classBaseAttrDictStar=%s" % (effID, effType, classLV, classBaseAttrDictStar))
        if classLV not in classBaseAttrDictStar:
            return
        __addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictStar[classLV], effAttrValue)
    #19    x阶装备洗炼属性提升x%        x阶
    elif effType == 19:
        customAttrDictWash = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Wash)[2]
        classBaseAttrDictWash = customAttrDictWash.get("classBaseAttrDictWash", {})
        classLV = effCond
        #GameWorld.DebugLog("    effID=%s,effType=%s,classLV=%s,classBaseAttrDictWash=%s" % (effID, effType, classLV, classBaseAttrDictWash))
        if classLV not in classBaseAttrDictWash:
            return
        __addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictWash[classLV], effAttrValue)
    #20    x阶装备附魔属性提升x%        x阶
    elif effType == 20:
        customAttrDictEnchant = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Enchant)[2]
        classBaseAttrDictEnchant = customAttrDictEnchant.get("classBaseAttrDictEnchant", {})
        classLV = effCond
        #GameWorld.DebugLog("    effID=%s,effType=%s,classLV=%s,classBaseAttrDictEnchant=%s" % (effID, effType, classLV, classBaseAttrDictEnchant))
        if classLV not in classBaseAttrDictEnchant:
            return
        __addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictEnchant[classLV], effAttrValue)
    #21    出战神兽装备强化每x级+xx属性    x级
    elif effType == 21:
        fightDogzTotalPlusLv = PlayerDogz.GetFightDogzTotalPlusLv(curPlayer)
        addAttrValue = int(fightDogzTotalPlusLv / effCond * effAttrValue)
        #GameWorld.DebugLog("    effID=%s,effType=%s,effCond=%s,fightDogzTotalPlusLv=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, fightDogzTotalPlusLv, attrID, addAttrValue))
        if attrID > 0 and addAttrValue > 0:
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
    return
def __addStarEffFuncAttr(ipyData, effAttrInfo, funcAttrInfo, effAttrValue):
    if not funcAttrInfo or effAttrValue <= 0:
        return
    isPer = ipyData.GetIsPer()
    effAttrIDList = ipyData.GetEffFuncAttrIDList() # 提升指定功能属性ID列表
    for attrID, attrValue in funcAttrInfo.items():
        if effAttrIDList and attrID not in effAttrIDList:
            continue
        if isPer:
            addAttrValue = int(attrValue * effAttrValue / 100.0)
        else:
            addAttrValue = effAttrValue
        if attrID > 0 and addAttrValue > 0:
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue
    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