#!/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 PlayerRune  
 | 
import ItemCommon  
 | 
import PlayerControl  
 | 
import IpyGameDataPY  
 | 
import ChPyNetSendPack  
 | 
import PlayerGatherSoul  
 | 
import NetPackCommon  
 | 
import IPY_GameWorld  
 | 
import PlayerHorse  
 | 
import PlayerDogz  
 | 
import PlayerPet  
 | 
import ChConfig  
 | 
import ItemControler  
 | 
import PlayerDienstgrad  
 | 
import PlayerCoat  
 | 
  
 | 
GubaoEffType_FamilyWar = 48 # ²ÎÓëÏÉÃËÁªÈüÿX´Î+XXXÊôÐÔ    x´Î  
 | 
GubaoEffType_ElderBattlefield = 49 # ²ÎÓëÉϹÅÕ½³¡Ã¿X´Î+XXXÊôÐÔ    x´Î  
 | 
GubaoEffType_CrossBattlefield = 50 # ²ÎÓë¹ÅÉñÕ½³¡Ã¿X´Î+XXXÊôÐÔ    x´Î  
 | 
GubaoEffType_CrossYaomoBoss = 51 # ²ÎÓëħÍõÈëÇÖÿX´Î+XXXÊôÐÔ    x´Î  
 | 
GubaoEffType_CrossFamilyFlagwar = 52 # ²ÎÓëÖð¹Íò½çÿX´Î+XXXÊôÐÔ    x´Î  
 | 
  
 | 
GubaoEffAttrIypeList = [GubaoEffType_FamilyWar, GubaoEffType_ElderBattlefield, GubaoEffType_CrossBattlefield,   
 | 
                        GubaoEffType_CrossYaomoBoss, GubaoEffType_CrossFamilyFlagwar]  
 | 
  
 | 
GubaoEffType_ActivityPlace = 33 # »îÔ¾ÐÞÁ¶x´Î¿ÉÁìÈ¡ÎïÆ·    x´Î  
 | 
GubaoEffType_Arena = 34 # ¾º¼¼³¡ÌôÕ½x´Î¿ÉÁìÈ¡ÎïÆ·    x´Î  
 | 
GubaoEffType_KillWorldBoss = 35 # »÷ɱÊÀ½çbossx´Î¿ÉÁìÈ¡ÎïÆ·    x´Î  
 | 
GubaoEffType_KillBossHome = 36 # »÷ɱbossÖ®¼Òbossx´Î¿ÉÁìÈ¡ÎïÆ·    x´Î  
 | 
GubaoEffType_KillCrossPenglaiBoss = 37 # »÷ɱÅîÀ³Ïɾ³bossx´Î¿ÉÁìÈ¡ÎïÆ·    x´Î  
 | 
GubaoEffType_KillCrossDemonLandBoss = 38 # »÷ɱħ»¯Ö®µØbossx´Î¿ÉÁìÈ¡ÎïÆ·    x´Î  
 | 
GubaoEffType_KillSealDemonBoss = 39 # »÷ɱ·âħ̳bossx´Î¿ÉÁìÈ¡ÎïÆ·    x´Î  
 | 
GubaoEffType_CrossRealmPK = 40 # ²ÎÓë¿ç·þÌìÌÝÈüx´Î¿ÉÁìÈ¡ÎïÆ·    x´Î  
 | 
  
 | 
# ¹Å±¦ÁìÈ¡ÎïÆ·ÌØÊâЧ¹ûÁÐ±í  
 | 
GubaoEffTtemIypeList = [GubaoEffType_ActivityPlace, GubaoEffType_Arena, GubaoEffType_KillWorldBoss, GubaoEffType_KillBossHome,  
 | 
                        GubaoEffType_KillCrossPenglaiBoss, GubaoEffType_KillCrossDemonLandBoss, GubaoEffType_KillSealDemonBoss,  
 | 
                        GubaoEffType_CrossRealmPK,  
 | 
                        ]  
 | 
  
 | 
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)  
 | 
    Sync_GubaoItemEffInfo(curPlayer)  
 | 
    Sync_GubaoPieceInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
def AddGubaoPiece(curPlayer, gubaoID, addCount, useItemID):  
 | 
    curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gubaoID)  
 | 
    updCount = min(curCount + addCount, ChConfig.Def_UpperLimit_DWord)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoPiece % gubaoID, updCount)  
 | 
    Sync_GubaoPieceInfo(curPlayer, [gubaoID])  
 | 
    GameWorld.Log("Ôö¼Ó¹Å±¦Ë鯬: gubaoID=%s,curCount=%s,addCount=%s,updCount=%s,useItemID=%s"   
 | 
                  % (gubaoID, curCount, addCount, updCount, useItemID), curPlayer.GetPlayerID())  
 | 
    return curCount, updCount  
 | 
  
 | 
def DelGubaoPiece(curPlayer, gubaoID, delCount, delName):  
 | 
    curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gubaoID)  
 | 
    if curCount < delCount:  
 | 
        return False  
 | 
    updCount = curCount - delCount  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoPiece % gubaoID, updCount)  
 | 
    Sync_GubaoPieceInfo(curPlayer, [gubaoID])  
 | 
    GameWorld.Log("¿Û³ý¹Å±¦Ë鯬: gubaoID=%s,curCount=%s,delCount=%s,updCount=%s,delName=%s"   
 | 
                  % (gubaoID, curCount, delCount, updCount, delName), curPlayer.GetPlayerID())  
 | 
    return True  
 | 
  
 | 
def ParseGubaoNeedItem(curPlayer, needItemList):  
 | 
    ## ½âÎö¹Å±¦¹¦ÄÜËùÐèÎïÆ·£¬×ª»¯Îª¹Å±¦Ë鯬+ÎïÆ·  
 | 
    needPieceInfo, realNeedItemList = {}, []  
 | 
    for itemID, itemCount in needItemList:  
 | 
        itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)  
 | 
        if not itemData:  
 | 
            continue  
 | 
        curEff = itemData.GetEffectByIndex(0)  
 | 
        effID = curEff.GetEffectID()  
 | 
        if effID != ChConfig.Def_Effect_GubaoPiece:  
 | 
            realNeedItemList.append([itemID, itemCount])  
 | 
            continue  
 | 
        gubaoID = curEff.GetEffectValue(0)  
 | 
        needPieceInfo[gubaoID] = needPieceInfo.get(gubaoID, 0) + itemCount  
 | 
    GameWorld.DebugLog("ת»¯¹Å±¦¹¦ÄÜËùÐèÎïÆ·: needItemList=%s,realNeedItemList=%s,needPieceInfo=%s"   
 | 
                       % (needItemList, realNeedItemList, needPieceInfo), curPlayer.GetPlayerID())  
 | 
    return needPieceInfo, realNeedItemList  
 | 
  
 | 
#// 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  
 | 
      
 | 
    needPieceInfo, realNeedItemList = ParseGubaoNeedItem(curPlayer, [[needItemID, needItemCnt]])  
 | 
    if realNeedItemList:  
 | 
        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  
 | 
    for gID, needPieceCount in needPieceInfo.items():  
 | 
        curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gID)  
 | 
        if curCount < needPieceCount:  
 | 
            GameWorld.DebugLog("¼¤»î¹Å±¦Ë鯬²»×ã! gubaoID=%s,curCount=%s < needPieceCount=%s" % (gubaoID, curCount, needPieceCount), playerID)  
 | 
            return  
 | 
          
 | 
    for gID, needPieceCount in needPieceInfo.items():  
 | 
        DelGubaoPiece(curPlayer, gID, needPieceCount, "Activate")  
 | 
    if realNeedItemList:  
 | 
        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  
 | 
      
 | 
    needPieceInfo, realNeedItemList = ParseGubaoNeedItem(curPlayer, needItemList)  
 | 
    if realNeedItemList:  
 | 
        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  
 | 
        lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(realNeedItemList, itemPack)  
 | 
        if lackItemDict:  
 | 
            GameWorld.DebugLog("¹Å±¦ÉýÐÇËùÐèÎïÆ·²»×㣡 star=%s,realNeedItemList=%s,lackItemDict=%s" % (star, realNeedItemList, lackItemDict), playerID)  
 | 
            return  
 | 
    for gID, needPieceCount in needPieceInfo.items():  
 | 
        curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gID)  
 | 
        if curCount < needPieceCount:  
 | 
            GameWorld.DebugLog("¹Å±¦ÉýÐÇËùÐè¹Å±¦Ë鯬²»×ã! gubaoID=%s,curCount=%s < needPieceCount=%s" % (gubaoID, curCount, needPieceCount), playerID)  
 | 
            return  
 | 
          
 | 
    #¿ÛÏûºÄ  
 | 
    for gID, needPieceCount in needPieceInfo.items():  
 | 
        DelGubaoPiece(curPlayer, gID, needPieceCount, "StarUp")  
 | 
    if realNeedItemList:  
 | 
        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  
 | 
    gubaoType = ipyData.GetGubaoType()  
 | 
    quality = ipyData.GetGubaoQuality()  
 | 
      
 | 
    if not IpyGameDataPY.GetIpyGameDataNotLog("GubaoLV", gubaoType, quality, lv + 1):  
 | 
        GameWorld.DebugLog("¹Å±¦ÒÑÂú¼¶£¡ gubaoID=%s,quality=%s,lv=%s" % (gubaoID, quality, lv), playerID)  
 | 
        return  
 | 
      
 | 
    lvIpyData = IpyGameDataPY.GetIpyGameData("GubaoLV", gubaoType, quality, lv)  
 | 
    if not lvIpyData:  
 | 
        return  
 | 
    needItemList = lvIpyData.GetLVUPNeedItemInfo()  
 | 
    if not needItemList:  
 | 
        return  
 | 
      
 | 
    needPieceInfo, realNeedItemList = ParseGubaoNeedItem(curPlayer, needItemList)  
 | 
    if realNeedItemList:  
 | 
        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  
 | 
        lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(realNeedItemList, itemPack)  
 | 
        if lackItemDict:  
 | 
            GameWorld.DebugLog("¹Å±¦Éý¼¶ËùÐèÎïÆ·²»×㣡 quality=%s,lv=%s,realNeedItemList=%s,lackItemDict=%s"   
 | 
                               % (quality, lv, realNeedItemList, lackItemDict), playerID)  
 | 
            return  
 | 
    for gID, needPieceCount in needPieceInfo.items():  
 | 
        curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gID)  
 | 
        if curCount < needPieceCount:  
 | 
            GameWorld.DebugLog("¹Å±¦Éý¼¶ËùÐè¹Å±¦Ë鯬²»×ã! gubaoID=%s,curCount=%s < needPieceCount=%s" % (gubaoID, curCount, needPieceCount), playerID)  
 | 
            return  
 | 
          
 | 
    #¿ÛÏûºÄ  
 | 
    for gID, needPieceCount in needPieceInfo.items():  
 | 
        DelGubaoPiece(curPlayer, gID, needPieceCount, "LVUp")  
 | 
    if realNeedItemList:  
 | 
        ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")  
 | 
      
 | 
    updLV = lv + 1  
 | 
    SetGubaoLVInfo(curPlayer, gubaoID, updLV, star)  
 | 
    GameWorld.Log("¹Å±¦Éý¼¶: gubaoID=%s,gubaoType=%s,quality=%s,updLV=%s" % (gubaoID, gubaoType, 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  
 | 
          
 | 
        gubaoType = ipyData.GetGubaoType()  
 | 
        quality = ipyData.GetGubaoQuality()  
 | 
        lvIpyData = IpyGameDataPY.GetIpyGameData("GubaoLV", gubaoType, 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, gubaoID, 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, gubaoID, effID, effAttrInfo):  
 | 
    ''' ¼ÆËã¹Å±¦ÌØÊâЧ¹ûID¶ÔÓ¦ÌáÉýÊôÐÔ  
 | 
    '''  
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("GubaoEffAttr", effID)  
 | 
    if not ipyData:  
 | 
        return  
 | 
    effType = ipyData.GetGubaoEffType()  
 | 
    effCond = ipyData.GetEffCond()  
 | 
    effCond2 = ipyData.GetEffCond2()  
 | 
    effCond3 = ipyData.GetEffCond3()  
 | 
    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  
 | 
              
 | 
    #22    ÌìÐÇËþÿͨ¹Øx²ã+xxÊôÐÔ                    x²ã  
 | 
    elif effType == 22:  
 | 
        skyTowerFloor = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor)  
 | 
        addAttrValue = int(skyTowerFloor / effCond * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,effCond=%s,skyTowerFloor=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, skyTowerFloor, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #23    ·ûÓ¡Ëþÿͨ¹Øx²ã+xxÊôÐÔ                    x²ã  
 | 
    elif effType == 23:  
 | 
        trialTowerPassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TrialTower_PassLV)  
 | 
        addAttrValue = int(trialTowerPassLV / effCond * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,effCond=%s,trialTowerPassLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, trialTowerPassLV, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #24    ·ûÓ¡µÈ¼¶Ã¿Ã¿x¼¶+xxÊôÐÔ                   x¼¶  
 | 
    elif effType == 24:  
 | 
        runeTotalLV = PlayerRune.GetRuneTotalLV(curPlayer)  
 | 
        addAttrValue = int(runeTotalLV / effCond * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,effCond=%s,runeTotalLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, runeTotalLV, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #25    ¾Û»êµÈ¼¶Ã¿Ã¿x¼¶+xxÊôÐÔ                   x¼¶  
 | 
    elif effType == 25:  
 | 
        soulTotalLV = PlayerGatherSoul.GetGatherSoulTotalLV(curPlayer)  
 | 
        addAttrValue = int(soulTotalLV / effCond * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,effCond=%s,soulTotalLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, soulTotalLV, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #26    x½××°±¸Ç¿»¯Ã¿x¼¶+xxÊôÐÔ                x½×        x¼¶  
 | 
    elif effType == 26:  
 | 
        customAttrDictPlus = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Plus)[2]  
 | 
        classPlusLVDict = customAttrDictPlus.get("classPlusLVDict", {})  
 | 
        classLV = effCond  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,classLV=%s,classPlusLVDict=%s" % (effID, effType, classLV, classPlusLVDict))  
 | 
        if classLV not in classPlusLVDict:  
 | 
            return  
 | 
        totalPlusLV = classPlusLVDict[classLV]  
 | 
        addAttrValue = int(totalPlusLV / effCond2 * effAttrValue)  
 | 
        #GameWorld.DebugLog("        effCond=%s,effCond2=%s,totalPlusLV=%s,attrID=%s,addAttrValue=%s" % (effCond, effCond2, totalPlusLV, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #27    x½××°±¸±¦Ê¯Ã¿x¼¶+xxÊôÐÔ                x½×        x¼¶  
 | 
    elif effType == 27:  
 | 
        customAttrDictStone = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Stone)[2]  
 | 
        classStoneLVDict = customAttrDictStone.get("classStoneLVDict", {})  
 | 
        classLV = effCond  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,classLV=%s,classStoneLVDict=%s" % (effID, effType, classLV, classStoneLVDict))  
 | 
        if classLV not in classStoneLVDict:  
 | 
            return  
 | 
        totalStoneLV = classStoneLVDict[classLV]  
 | 
        addAttrValue = int(totalStoneLV / effCond2 * effAttrValue)  
 | 
        #GameWorld.DebugLog("        effCond=%s,effCond2=%s,totalStoneLV=%s,attrID=%s,addAttrValue=%s" % (effCond, effCond2, totalStoneLV, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #28    x½××°±¸ÉýÐÇÿxÐÇ+xxÊôÐÔ                x½×        xÐÇ  
 | 
    elif effType == 28:  
 | 
        customAttrDictStar = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Star)[2]  
 | 
        classStarLVDict = customAttrDictStar.get("classStarLVDict", {})  
 | 
        classLV = effCond  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,classLV=%s,classStarLVDict=%s" % (effID, effType, classLV, classStarLVDict))  
 | 
        if classLV not in classStarLVDict:  
 | 
            return  
 | 
        totalStarLV = classStarLVDict[classLV]  
 | 
        addAttrValue = int(totalStarLV / effCond2 * effAttrValue)  
 | 
        #GameWorld.DebugLog("        effCond=%s,effCond2=%s,totalStarLV=%s,attrID=%s,addAttrValue=%s" % (effCond, effCond2, totalStarLV, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #29    x½××°±¸Ï´Á·Ã¿x¼¶+xxÊôÐÔ                x½×        x¼¶  
 | 
    elif effType == 29:  
 | 
        customAttrDictWash = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Wash)[2]  
 | 
        classWashLVDict = customAttrDictWash.get("classWashLVDict", {})  
 | 
        classLV = effCond  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,classLV=%s,classWashLVDict=%s" % (effID, effType, classLV, classWashLVDict))  
 | 
        if classLV not in classWashLVDict:  
 | 
            return  
 | 
        totalWashLV = classWashLVDict[classLV]  
 | 
        addAttrValue = int(totalWashLV / effCond2 * effAttrValue)  
 | 
        #GameWorld.DebugLog("        effCond=%s,effCond2=%s,totalWashLV=%s,attrID=%s,addAttrValue=%s" % (effCond, effCond2, totalWashLV, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #30    x½××°±¸¸½Ä§Ã¿x¼¶+xxÊôÐÔ                x½×        x¼¶  
 | 
    elif effType == 30:  
 | 
        customAttrDictEnchant = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Enchant)[2]  
 | 
        classEnchantLVDict = customAttrDictEnchant.get("classEnchantLVDict", {})  
 | 
        classLV = effCond  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,classLV=%s,classEnchantLVDict=%s" % (effID, effType, classLV, classEnchantLVDict))  
 | 
        if classLV not in classEnchantLVDict:  
 | 
            return  
 | 
        totalEnchantLV = classEnchantLVDict[classLV]  
 | 
        addAttrValue = int(totalEnchantLV / effCond2 * effAttrValue)  
 | 
        #GameWorld.DebugLog("        effCond=%s,effCond2=%s,totalEnchantLV=%s,attrID=%s,addAttrValue=%s" % (effCond, effCond2, totalEnchantLV, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #31    x½××°±¸x¼þxÆ·ÖÊ×°±¸+xxÊôÐÔ            x½×        x¼þ        xÆ·ÖÊ  
 | 
    elif effType == 31:  
 | 
        customAttrDictEquip = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Equip)[2]  
 | 
        classEquipColorDict = customAttrDictEquip.get("classEquipColorDict", {})  
 | 
        classLV = effCond  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,classLV=%s,classEquipColorDict=%s" % (effID, effType, classLV, classEquipColorDict))  
 | 
        if classLV not in classEquipColorDict:  
 | 
            return  
 | 
        equipColorDict = classEquipColorDict[classLV]  
 | 
        equipColorCnt = 0  
 | 
        for itemColor in equipColorDict.values():  
 | 
            if itemColor >= effCond3:  
 | 
                equipColorCnt += 1  
 | 
        addAttrValue = int(equipColorCnt / effCond2 * effAttrValue)  
 | 
        #GameWorld.DebugLog("        effCond=%s,effCond2=%s,effCond3=%s,equipColorCnt=%s,attrID=%s,addAttrValue=%s" % (effCond, effCond2, effCond3, equipColorCnt, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #32    »ñµÃxµãÁé¸ùµã+xxÊôÐÔ                        xµã  
 | 
    elif effType == 32:  
 | 
        totalLingGenPoint = PlayerControl.GetTotalLingGenPoint(curPlayer)  
 | 
        addAttrValue = int(totalLingGenPoint / effCond * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,effCond=%s,totalLingGenPoint=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, totalLingGenPoint, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #41    xÀàÐÍÉñ±øÃ¿X¼¶+XÊôÐÔ    xÀàÐÍ    x¼¶  
 | 
    elif effType == 41:  
 | 
        gwType = effCond  
 | 
        gwLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GodWeaponLV % gwType)  
 | 
        addAttrValue = int(gwLV / effCond2 * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,gwType=%s,gwLV=%s,effCond2=%s,attrID=%s,addAttrValue=%s" % (effID, effType, gwType, gwLV, effCond2, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
          
 | 
    #42    ·¨Æ÷ÿX½×+X%·¨Æ÷×ÜÊôÐÔ    x½×  
 | 
    elif effType == 42:  
 | 
        customAttrDictFaQi = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_FaQi)[2]  
 | 
        faQiAllAttrInfo = customAttrDictFaQi.get("faQiAllAttrInfo", {})  
 | 
        faQiLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiLV)  
 | 
        addPer = int(faQiLV / effCond * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,faQiLV=%s,addPer=%s,faQiAllAttrInfo=%s" % (effID, effType, faQiLV, addPer, faQiAllAttrInfo))  
 | 
        __addStarEffFuncAttr(ipyData, effAttrInfo, faQiAllAttrInfo, addPer)  
 | 
              
 | 
    #43    Ã¿ÓµÓÐX¸öXÀàÐ͵ijƺÅ+XÊôÐÔ    xÀàÐÍ    x¸ö  
 | 
    elif effType == 43:  
 | 
        activeTypeCountDict = PlayerDienstgrad.GetDienstgradActiveTypeCountInfo(curPlayer)  
 | 
        dType = effCond  
 | 
        activeCount = activeTypeCountDict.get(dType, 0)  
 | 
        addAttrValue = int(activeCount / effCond2 * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,dType=%s,activeTypeCountDict=%s,effCond2=%s,attrID=%s,addAttrValue=%s" % (effID, effType, dType, activeTypeCountDict, effCond2, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
              
 | 
    #44    XÆ·ÖÊʱװ×ÜÐÇÊýÿXÐÇ+XÊôÐÔ    xÀàÐÍ    xÐÇ  
 | 
    elif effType == 44:  
 | 
        costQualityLVDict = PlayerCoat.GetCoatQualityLVInfo(curPlayer)  
 | 
        quality = effCond  
 | 
        lvTotal = costQualityLVDict.get(quality, 0)  
 | 
        addAttrValue = int(lvTotal / effCond2 * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,quality=%s,costQualityLVDict=%s,effCond2=%s,attrID=%s,addAttrValue=%s" % (effID, effType, quality, costQualityLVDict, effCond2, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #45    Ã¿X¼¶÷ÈÁ¦µÈ¼¶+XÊôÐÔ    x¼¶  
 | 
    elif effType == 45:  
 | 
        charmLV = PlayerControl.GetCharmLV(curPlayer)  
 | 
        addAttrValue = int(charmLV / effCond * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,charmLV=%s,effCond=%s,attrID=%s,addAttrValue=%s" % (effID, effType, charmLV, effCond, attrID, addAttrValue))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #46    Ã¿ÓµÓÐX¸öÉñͨ¼¼ÄÜ+XÊôÐÔ    x¸ö  
 | 
    elif effType == 46:  
 | 
        customAttrDictShentong = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Shentong)[2]  
 | 
        shentongSkillInfo = customAttrDictShentong.get("shentongSkillInfo", {})  
 | 
        skillCount = len(shentongSkillInfo)  
 | 
        addAttrValue = int(skillCount / effCond * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,skillCount=%s,effCond=%s,attrID=%s,addAttrValue=%s,shentongSkillInfo=%s" % (effID, effType, skillCount, effCond, attrID, addAttrValue, shentongSkillInfo))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #47    Éñͨ¼¼ÄÜ×ܵȼ¶Ã¿X¼¶+XÊôÐÔ    x¼¶  
 | 
    elif effType == 47:  
 | 
        customAttrDictShentong = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Shentong)[2]  
 | 
        shentongSkillInfo = customAttrDictShentong.get("shentongSkillInfo", {})  
 | 
        skillLVTotal = sum(shentongSkillInfo.values())  
 | 
        addAttrValue = int(skillLVTotal / effCond * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,skillLVTotal=%s,effCond=%s,attrID=%s,addAttrValue=%s,shentongSkillInfo=%s" % (effID, effType, skillLVTotal, effCond, attrID, addAttrValue, shentongSkillInfo))  
 | 
        if attrID > 0 and addAttrValue > 0:  
 | 
            effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  
 | 
              
 | 
    #48    ²ÎÓëÏÉÃËÁªÈüÿX´Î+XXXÊôÐÔ    x´Î  
 | 
    #49    ²ÎÓëÉϹÅÕ½³¡Ã¿X´Î+XXXÊôÐÔ    x´Î  
 | 
    #50    ²ÎÓë¹ÅÉñÕ½³¡Ã¿X´Î+XXXÊôÐÔ    x´Î  
 | 
    #51    ²ÎÓëħÍõÈëÇÖÿX´Î+XXXÊôÐÔ    x´Î  
 | 
    #52    ²ÎÓëÖð¹Íò½çÿX´Î+XXXÊôÐÔ    x´Î  
 | 
    elif effType in GubaoEffAttrIypeList:  
 | 
        effValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))  
 | 
        addAttrValue = int(effValue / effCond * effAttrValue)  
 | 
        #GameWorld.DebugLog("    effID=%s,effType=%s,effValue=%s,effCond=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effValue, effCond, 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 AddGubaoItemEffValue(curPlayer, effType, addCnt):  
 | 
    if effType not in GubaoEffTtemIypeList and effType not in GubaoEffAttrIypeList:  
 | 
        return  
 | 
    isAttr = False  
 | 
    ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
    for index in xrange(ipyDataMgr.GetGubaoCount()):  
 | 
        ipyData = ipyDataMgr.GetGubaoByIndex(index)  
 | 
        gubaoID = ipyData.GetGubaoID()  
 | 
        _, star = GetGubaoLVInfo(curPlayer, gubaoID)  
 | 
        if not star:  
 | 
            continue  
 | 
        starIpyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)  
 | 
        if not starIpyData:  
 | 
            continue  
 | 
        starEffIDList = starIpyData.GetStarEffIDList()  
 | 
        for effID in starEffIDList:  
 | 
            effIpyData = IpyGameDataPY.GetIpyGameData("GubaoEffAttr", effID)  
 | 
            if not effIpyData:  
 | 
                continue  
 | 
            if effType != effIpyData.GetGubaoEffType():  
 | 
                continue  
 | 
            effValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))  
 | 
            updValue = min(effValue + addCnt, ChConfig.Def_UpperLimit_DWord)  
 | 
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType), updValue)  
 | 
            GameWorld.DebugLog("¸üйű¦ÎïÆ·Ð§¹ûÀàÐͽø¶ÈÖµ: gubaoID=%s,effID=%s,effType=%s,effValue=%s,addCnt=%s,updValue=%s"   
 | 
                               % (gubaoID, effID, effType, effValue, addCnt, updValue), curPlayer.GetPlayerID())  
 | 
            Sync_GubaoItemEffInfo(curPlayer, gubaoID, effType, True)  
 | 
            if effType in GubaoEffAttrIypeList:  
 | 
                isAttr = True  
 | 
                  
 | 
    if isAttr:  
 | 
        RefreshGubaoAttr(curPlayer)  
 | 
    return  
 | 
  
 | 
def GetGubaoItemEffAward(curPlayer, gubaoID, effIDStr):  
 | 
    _, star = GetGubaoLVInfo(curPlayer, gubaoID)  
 | 
    if not star:  
 | 
        #GameWorld.DebugLog("¹Å±¦ÎïÆ·Ð§¹ûÁì½±! Ã»ÓÐÐǼ¶! gubaoID=%s" % (gubaoID), curPlayer.GetPlayerID())  
 | 
        return  
 | 
    starIpyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)  
 | 
    if not starIpyData:  
 | 
        return  
 | 
    starEffIDList = starIpyData.GetStarEffIDList()  
 | 
    effID = GameWorld.ToIntDef(effIDStr)  
 | 
    if not effID or effID not in starEffIDList:  
 | 
        GameWorld.DebugLog("¹Å±¦ÎïÆ·Ð§¹ûÁì½±! ¸ÃÐǼ¶²»´æÔÚ¸ÃЧ¹ûID! gubaoID=%s,star=%s,effID=%s"   
 | 
                           % (gubaoID, star, effID), curPlayer.GetPlayerID())  
 | 
        return  
 | 
    effIpyData = IpyGameDataPY.GetIpyGameData("GubaoEffAttr", effID)  
 | 
    if not effIpyData:  
 | 
        return  
 | 
    effType = effIpyData.GetGubaoEffType()  
 | 
    if effType not in GubaoEffTtemIypeList:  
 | 
        GameWorld.DebugLog("¹Å±¦ÎïÆ·Ð§¹ûÁì½±! ·ÇÎïÆ·Ð§¹ûÀàÐÍ! gubaoID=%s,star=%s,effID=%s,effType=%s"   
 | 
                           % (gubaoID, star, effID, effType), curPlayer.GetPlayerID())  
 | 
        return  
 | 
    condValue = effIpyData.GetEffCond()  
 | 
    awardItemList = effIpyData.GetEffItemAwardList()  
 | 
    if not condValue or not awardItemList:  
 | 
        return  
 | 
    effValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))  
 | 
    getTimes = effValue / condValue  
 | 
    if getTimes <= 0:  
 | 
        GameWorld.DebugLog("¹Å±¦ÎïÆ·Ð§¹ûÁì½±! Î´´ïµ½Áì½±Ìõ¼þ! gubaoID=%s,star=%s,effID=%s,effType=%s,effValue=%s,condValue=%s"   
 | 
                           % (gubaoID, star, effID, effType, effValue, condValue), curPlayer.GetPlayerID())  
 | 
        return  
 | 
    awardItemTotalList = []  
 | 
    if getTimes > 1:  
 | 
        for itemID, itemCount, isAuctionItem in awardItemList:  
 | 
            awardItemTotalList.append([itemID, int(itemCount * getTimes), isAuctionItem])  
 | 
    else:  
 | 
        awardItemTotalList = awardItemList  
 | 
    updValue = effValue % condValue  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType), updValue)  
 | 
    Sync_GubaoItemEffInfo(curPlayer, gubaoID, effType, True)  
 | 
    GameWorld.DebugLog("¹Å±¦ÎïÆ·Ð§¹ûÁì½±: gubaoID=%s,star=%s,effID=%s,effType=%s,effValue=%s,condValue=%s,getTimes=%s,updValue=%s,awardItemTotalList=%s"   
 | 
                       % (gubaoID, star, effID, effType, effValue, condValue, getTimes, updValue, awardItemTotalList), curPlayer.GetPlayerID())  
 | 
    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemTotalList, event=["Gubao", False, {}])  
 | 
    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  
 | 
  
 | 
def Sync_GubaoItemEffInfo(curPlayer, gubaoID=0, effType=0, force=False):  
 | 
    syncIDList = []  
 | 
    if not gubaoID:  
 | 
        ipyDataMgr = IpyGameDataPY.IPY_Data()  
 | 
        for index in range(ipyDataMgr.GetGubaoCount()):  
 | 
            ipyData = ipyDataMgr.GetGubaoByIndex(index)  
 | 
            syncIDList.append(ipyData.GetGubaoID())  
 | 
    else:  
 | 
        syncIDList = [gubaoID]  
 | 
          
 | 
    syncEffTypeList = [effType] if effType else GubaoEffTtemIypeList  
 | 
      
 | 
    itemEffInfoList = []  
 | 
    for gubaoID in syncIDList:  
 | 
        for effType in syncEffTypeList:  
 | 
            effValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))  
 | 
            if not effValue and not force:  
 | 
                # ·ÇÇ¿ÖÆÍ¬²½Çé¿öÏÂֻͬ²½ÓÐÖµµÄ  
 | 
                continue  
 | 
            eff = ChPyNetSendPack.tagMCGubaoItemEff()  
 | 
            eff.GubaoID = gubaoID  
 | 
            eff.EffType = effType  
 | 
            eff.EffValue = effValue  
 | 
            itemEffInfoList.append(eff)  
 | 
              
 | 
    if not itemEffInfoList:  
 | 
        return  
 | 
      
 | 
    clientPack = ChPyNetSendPack.tagMCGubaoItemEffInfo()  
 | 
    clientPack.ItemEffInfoList = itemEffInfoList  
 | 
    clientPack.Count = len(clientPack.ItemEffInfoList)  
 | 
    NetPackCommon.SendFakePack(curPlayer, clientPack)  
 | 
    return  
 | 
  
 | 
def Sync_GubaoPieceInfo(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  
 | 
          
 | 
    pieceInfoList = []  
 | 
    for gubaoID in syncIDList:  
 | 
        curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gubaoID)  
 | 
        if not curCount and gubaoIDList == None:  
 | 
            # Ã»ÓÐÖ¸¶¨Ê±Ö»Í¬²½ÓÐÊýÁ¿µÄ  
 | 
            continue  
 | 
        gubao = ChPyNetSendPack.tagMCGubaoPiece()  
 | 
        gubao.GubaoID = gubaoID  
 | 
        gubao.PieceCount = curCount  
 | 
        pieceInfoList.append(gubao)  
 | 
          
 | 
    if not pieceInfoList:  
 | 
        return  
 | 
      
 | 
    clientPack = ChPyNetSendPack.tagMCGubaoPieceInfo()  
 | 
    clientPack.PieceInfoList = pieceInfoList  
 | 
    clientPack.Count = len(clientPack.PieceInfoList)  
 | 
    NetPackCommon.SendFakePack(curPlayer, clientPack)  
 | 
    return  
 |