| #!/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 PlayerGatherTheSoul  | 
| import PlayerActGubao  | 
| 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,  | 
|                         ]  | 
|   | 
| # ¹Å±¦Áé¸ùµãÌØÊâЧ¹ûÁÐ±í  | 
| GubaoEffFreePointTypeList = [54, 55, 56]  | 
|   | 
| # ÐèÒª¼Ç¼EffValueµÄEffTypeÁÐ±í  | 
| NeedGubaoItemEffValueTypeList = GubaoEffAttrIypeList + GubaoEffTtemIypeList + GubaoEffFreePointTypeList  | 
|   | 
| 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):  | 
|     DoGubaoAddFreePoint(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)  | 
|     DoGubaoAddFreePoint(curPlayer, gubaoID)  | 
|       | 
|     RefreshGubaoAttr(curPlayer)  | 
|     Sync_GubaoInfo(curPlayer, [gubaoID])  | 
|       | 
|     PlayerActGubao.OnGubaoCost(curPlayer, needPieceInfo, realNeedItemList)  | 
|     return  | 
|   | 
| #// B2 17 ¹Å±¦ÉýÐÇ #tagCMGubaoStarUp  | 
| #  | 
| #struct    tagCMGubaoPieceUse  | 
| #{  | 
| #    WORD        GubaoID;        // Í¨ÓÃË鯬¹Å±¦ID  | 
| #    WORD        PieceCount;    // Ê¹ÓÃË鯬¸öÊý  | 
| #};  | 
| #  | 
| #struct    tagCMGubaoStarUp  | 
| #{  | 
| #    tagHead         Head;  | 
| #    WORD        GubaoID;      | 
| #    BYTE        PieceSelectCount;  | 
| #    tagCMGubaoPieceUse    CommPieceUseList[PieceSelectCount];    // Í¨Óùű¦ËéÆ¬Ê¹ÓÃÁÐ±í  | 
| #};  | 
| 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()  | 
|     needQualityPiece = ipyData.GetStarUPNeedQualityPiece()  | 
|     if not needItemList and not needQualityPiece:  | 
|         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  | 
|           | 
|     if needQualityPiece:  | 
|         commPieceUseLimitInfo = IpyGameDataPY.GetFuncEvalCfg("GubaoPiece", 1, {})  | 
|         selectPieceDict = {}  | 
|         for pieceUse in curPackData.CommPieceUseList:  | 
|             useGubaoID = pieceUse.GubaoID  | 
|             usePieceCnt = pieceUse.PieceCount  | 
|             useIpyData = IpyGameDataPY.GetIpyGameData("Gubao", useGubaoID)  | 
|             if not useIpyData:  | 
|                 return  | 
|             quality = useIpyData.GetGubaoQuality()  | 
|             if str(quality) not in commPieceUseLimitInfo:  | 
|                 GameWorld.DebugLog("¸Ã¹Å±¦Æ·ÖÊûÓÐÅäÖÿÉ×÷ΪͨÓÃËéÆ¬Ê¹ÓõÄ×îµÍÐǼ¶! useGubaoID=%s" % (useGubaoID), playerID)  | 
|                 return  | 
|             needStar = commPieceUseLimitInfo[str(quality)]  | 
|             _, usePieceStar = GetGubaoLVInfo(curPlayer, useGubaoID)  | 
|             if usePieceStar < needStar:  | 
|                 GameWorld.DebugLog("¸Ã¹Å±¦Æ·ÖÊÐǼ¶²»×㣬ÎÞ·¨×÷ΪͨÓÃË鯬! useGubaoID=%s,usePieceStar=%s < %s" % (useGubaoID, usePieceStar, needStar), playerID)  | 
|                 return  | 
|             selectPieceDict[quality] = selectPieceDict.get(quality, 0) + usePieceCnt  | 
|             needPieceInfo[useGubaoID] = needPieceInfo.get(useGubaoID, 0) + usePieceCnt  | 
|               | 
|         for quality, needCount in needQualityPiece:  | 
|             selectCount = selectPieceDict.get(quality, 0)  | 
|             if selectCount != needCount: # Ð辫ȷƥÅä¸öÊý£¬¶à»òÉÙ¶¼²»ÔÊÐíÉýÐÇ£¬·ÀÖ¹¶à¿Û»òÕßÉÙ¿Û  | 
|                 GameWorld.ErrLog("Ñ¡ÔñʹÓÃµÄÆ·ÖÊͨÓÃË鯬¸öÊý²»Æ¥Å䣬ÎÞ·¨ÉýÐÇ!  gubaoID=%s,star=%s,quality=%s,selectCount=%s != %s"   | 
|                                  % (gubaoID, star, quality, selectCount, needCount), playerID)  | 
|                 return  | 
|               | 
|         GameWorld.DebugLog("ËùÐè¹Å±¦Ë鯬»ã×Ü: %s" % needPieceInfo, playerID)  | 
|           | 
|     for costGubaoID, needPieceCount in needPieceInfo.items():  | 
|         curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % costGubaoID)  | 
|         if curCount < needPieceCount:  | 
|             GameWorld.DebugLog("¹Å±¦ÉýÐÇËùÐè¹Å±¦Ë鯬²»×ã! gubaoID=%s,costGubaoID=%s,curCount=%s < needPieceCount=%s" % (gubaoID, costGubaoID, curCount, needPieceCount), playerID)  | 
|             return  | 
|           | 
|     #¿ÛÏûºÄ  | 
|     for costGubaoID, needPieceCount in needPieceInfo.items():  | 
|         DelGubaoPiece(curPlayer, costGubaoID, 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)  | 
|     DoGubaoAddFreePoint(curPlayer, gubaoID)  | 
|     RefreshGubaoAttr(curPlayer)  | 
|     Sync_GubaoInfo(curPlayer, [gubaoID])  | 
|       | 
|     PlayerActGubao.OnGubaoCost(curPlayer, needPieceInfo, realNeedItemList)  | 
|     return  | 
|   | 
| def DoGubaoAddFreePoint(curPlayer, gubaoID=0):  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     effPointDict = {}  | 
|     if gubaoID:  | 
|         __calcStarEffAddFreePoint(curPlayer, gubaoID, effPointDict)  | 
|     else:  | 
|         ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|         for index in xrange(ipyDataMgr.GetGubaoCount()):  | 
|             ipyData = ipyDataMgr.GetGubaoByIndex(index)  | 
|             gubaoID = ipyData.GetGubaoID()  | 
|             __calcStarEffAddFreePoint(curPlayer, gubaoID, effPointDict)  | 
|               | 
|     if not effPointDict:  | 
|         return  | 
|       | 
|     unAddFreePointTotal = 0  | 
|     for effKey, addFreePointTotal in effPointDict.items():  | 
|         gubaoID, star, effType = effKey   | 
|         # ÒÑÔö¼ÓµÄµãÊý  | 
|         addFreePointAlready = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType))  | 
|         unAddFreePoint = max(0, addFreePointTotal - addFreePointAlready)  | 
|         unAddFreePointTotal += unAddFreePoint  | 
|         GameWorld.DebugLog("¹Å±¦ÐǼ¶Ôö¼ÓÁé¸ùµã: gubaoID=%s,star=%s,addFreePointTotal=%s,addFreePointAlready=%s,unAddFreePoint=%s,total=%s"   | 
|                            % (gubaoID, star, addFreePointTotal, addFreePointAlready, unAddFreePoint, unAddFreePointTotal), playerID)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoItemEffValue % (gubaoID, effType), addFreePointTotal)  | 
|         if unAddFreePoint:  | 
|             Sync_GubaoItemEffInfo(curPlayer, gubaoID, effType, True)  | 
|               | 
|     if unAddFreePointTotal <= 0:  | 
|         return  | 
|     freePoint = curPlayer.GetFreePoint()  | 
|     updFreePoint = freePoint + unAddFreePointTotal  | 
|     curPlayer.SetFreePoint(updFreePoint)  | 
|     return  | 
|   | 
| def __calcStarEffAddFreePoint(curPlayer, gubaoID, effPointDict):  | 
|     _, star = GetGubaoLVInfo(curPlayer, gubaoID)  | 
|     if not star:  | 
|         return  | 
|     starIpyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)  | 
|     if not starIpyData:  | 
|         return  | 
|     starEffIDList = starIpyData.GetStarEffIDList()  | 
|     for effID in starEffIDList:  | 
|         effIpyData = IpyGameDataPY.GetIpyGameData("GubaoEffAttr", effID)  | 
|         if not effIpyData:  | 
|             continue  | 
|         effType = effIpyData.GetGubaoEffType()  | 
|         effCond = effIpyData.GetEffCond()  | 
|         effAttrValue = effIpyData.GetEffAttrValue()  | 
|           | 
|         effKey = (gubaoID, star, effType)  | 
|         if effType == 54: # Ôö¼ÓxµãÁé¸ù  | 
|             addFreePointTotal = effIpyData.GetEffAttrValue()  | 
|             effPointDict[effKey] = effPointDict.get(effKey, 0) + addFreePointTotal  | 
|         elif effType == 55: # ¾³½çÿ¼¶Ôö¼ÓXµãÁé¸ù  | 
|             realmLV = curPlayer.GetOfficialRank()  | 
|             addFreePointTotal = int(realmLV / effCond * effAttrValue)  | 
|             effPointDict[effKey] = effPointDict.get(effKey, 0) + addFreePointTotal  | 
|         elif effType == 56: # µÈ¼¶Ã¿¼¶Ôö¼ÓXµãÁé¸ù  | 
|             playerLV = curPlayer.GetLV()  | 
|             addFreePointTotal = int(playerLV / effCond * effAttrValue)  | 
|             effPointDict[effKey] = effPointDict.get(effKey, 0) + addFreePointTotal  | 
|               | 
|     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])  | 
|       | 
|     PlayerActGubao.OnGubaoCost(curPlayer, needPieceInfo, realNeedItemList)  | 
|     return  | 
|   | 
| def GetGubaoTotalLVStar(curPlayer):  | 
|     ## »ñÈ¡¹Å±¦×ܵȼ¶£¬ÐÇÊý  | 
|     totalLV, totalStar =  0, 0  | 
|     ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|     for index in xrange(ipyDataMgr.GetGubaoCount()):  | 
|         ipyData = ipyDataMgr.GetGubaoByIndex(index)  | 
|         gubaoID = ipyData.GetGubaoID()  | 
|         lv, star = GetGubaoLVInfo(curPlayer, gubaoID)  | 
|         totalLV += lv  | 
|         totalStar += star  | 
|     return totalLV, totalStar  | 
|   | 
| def RefreshGubaoAttr(curPlayer):  | 
|     #CalcGubaoAttr(curPlayer)  | 
|     PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()  | 
|     return  | 
|   | 
| def CalcGubaoAttr(curPlayer):  | 
|       | 
|     allAttrList = [{} for _ in range(4)]  | 
|     allAttrListResonance = [{} 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:  | 
|             starAttrIDList = starIpyData.GetStarAttrIDList()  | 
|             starAttrValueList = starIpyData.GetStarAttrValueList()  | 
|             for i, attrID in enumerate(starAttrIDList):  | 
|                 attrValue = starAttrValueList[i]  | 
|                 PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)  | 
|                   | 
|             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)  | 
|                   | 
|     # ¹²Ãù  | 
|     for index in range(ipyDataMgr.GetGubaoResonanceCount()):  | 
|         ipyData = ipyDataMgr.GetGubaoResonanceByIndex(index)  | 
|         resonanceID = ipyData.GetResonanceID()  | 
|         gubaoIDList = ipyData.GetGubaoIDList()  | 
|         if not gubaoIDList:  | 
|             continue  | 
|           | 
|         gubaoStarDict = {}  | 
|         for gubaoID in gubaoIDList:  | 
|             _, star = GetGubaoLVInfo(curPlayer, gubaoID)  | 
|             gubaoStarDict[gubaoID] = star  | 
|         minStar = min(gubaoStarDict.values()) # ¹²ÃùÐǼ¶£¬È¡×éºÏÖÐ×îµÍ¹Å±¦ÐǼ¶  | 
|         if not minStar:  | 
|             #GameWorld.DebugLog("¹²Ãù×éºÏ´æÔڹű¦Î´¼¤»î! resonanceID=%s,gubaoStarDict=%s" % (resonanceID, gubaoStarDict))  | 
|             continue  | 
|           | 
|         attrIpyDataList = IpyGameDataPY.GetIpyGameDataList("GubaoResonanceAttr", resonanceID)  | 
|         if not attrIpyDataList:  | 
|             continue  | 
|           | 
|         resonanceAttrIpyData = None  | 
|         for attrIpyData in attrIpyDataList:  | 
|             resonanceStar = attrIpyData.GetResonanceStar()  | 
|             if resonanceStar > minStar:  | 
|                 break  | 
|             resonanceAttrIpyData = attrIpyData  | 
|               | 
|         if not resonanceAttrIpyData:  | 
|             #GameWorld.DebugLog("ûÓйű¦¹²ÃùÊôÐÔ! resonanceID=%s,minStar=%s" % (resonanceID, minStar))  | 
|             continue  | 
|           | 
|         #GameWorld.DebugLog("¹Å±¦¹²Ãù: resonanceID=%s,resonanceStar=%s,gubaoStarDict=%s" % (resonanceID, resonanceAttrIpyData.GetResonanceStar(), gubaoStarDict))  | 
|         resonanceAttrIDList = resonanceAttrIpyData.GetResonanceAttrIDList()  | 
|         resonanceAttrValueList = resonanceAttrIpyData.GetResonanceAttrValueList()  | 
|         for i, attrID in enumerate(resonanceAttrIDList):  | 
|             attrValue = resonanceAttrValueList[i]  | 
|             PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListResonance)  | 
|               | 
|     # ±£´æ¼ÆËãÖµ  | 
|     #GameWorld.DebugLog("¹Å±¦ÊôÐÔ: %s" % allAttrList)  | 
|     #GameWorld.DebugLog("¹Å±¦¹²ÃùÊôÐÔ: %s" % allAttrListResonance)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Gubao, allAttrList)  | 
|     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_GubaoResonance, allAttrListResonance)  | 
|     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  | 
|               | 
|     #53    ÏâǶxÆ·Öʾۻêÿx¸ö+xxÊôÐÔ    xÆ·ÖÊ    x¸ö  | 
|     elif effType == 53:  | 
|         soulColor = effCond  | 
|         colorCount = PlayerGatherTheSoul.GetHoleSoulColorCount(curPlayer, soulColor, True)  | 
|         addAttrValue = int(colorCount / effCond2 * effAttrValue)  | 
|         #GameWorld.DebugLog("    effID=%s,effType=%s,soulColor=%s,colorCount=%s,effCond2=%s,attrID=%s,addAttrValue=%s" % (effID, effType, soulColor, colorCount, effCond2, attrID, addAttrValue))  | 
|         if attrID > 0 and addAttrValue > 0:  | 
|             effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  | 
|               | 
|     #57    ×øÆï»ù´¡ÊôÐÔÌáÉýx%  | 
|     elif effType == 57:  | 
|         customAttrDict = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Horse)[2]  | 
|         horseBaseAttrInfo = customAttrDict.get("horseBaseAttrInfo", {})  | 
|         #GameWorld.DebugLog("    effID=%s,effType=%s,horseBaseAttrInfo=%s,effAttrInfo=%s" % (effID, effType, horseBaseAttrInfo, effAttrInfo))  | 
|         __addStarEffFuncAttr(ipyData, effAttrInfo, horseBaseAttrInfo, effAttrValue)  | 
|          | 
|     #58    ×øÆïÿx¼¶+xxÊôÐÔ                   x¼¶  | 
|     elif effType == 58:  | 
|         horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV)  | 
|         addAttrValue = int(horseLV / effCond * effAttrValue)  | 
|         #GameWorld.DebugLog("    effID=%s,effType=%s,effCond=%s,horseLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, horseLV, attrID, addAttrValue))  | 
|         if attrID > 0 and addAttrValue > 0:  | 
|             effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue  | 
|               | 
|     #59    ·¨Æ÷ÿX½×+xxÊôÐÔ    x½×  | 
|     elif effType == 59:  | 
|         faQiLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiLV)  | 
|         addAttrValue = int(faQiLV / effCond * effAttrValue)  | 
|         #GameWorld.DebugLog("    effID=%s,effType=%s,effCond=%s,faQiLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, faQiLV, 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 NeedGubaoItemEffValueTypeList  | 
|       | 
|     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  |