| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerWing  | 
| #  | 
| # @todo:³á°òϵͳ  | 
| # @author sgj  | 
| # @date 2017-8-19  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ³á°òϵͳ  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2017-8-19 ÏÂÎç06:02:33"""  | 
| #-------------------------------------------------------------------------------  | 
| import IPY_GameWorld  | 
| import GameWorld  | 
| import PlayerControl  | 
| import IpyGameDataPY  | 
| import ChConfig  | 
| import ShareDefine  | 
| import ItemCommon  | 
| import GameFuncComm  | 
| import PlayerSuccess  | 
| import ItemControler  | 
| import ChEquip  | 
|   | 
| import random  | 
|   | 
|   | 
| #A3 2E ÓðÒí¾«Á¶ #tagCMWingup  | 
| # struct    tagCMWingUp  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE           Count;    //Ë÷Òý¸öÊý  | 
| #    BYTE           WingIndexList[Count]; //²ÄÁϳá°òÔÚ±³°üÖеÄË÷ÒýÁÐ±í  | 
| # };   | 
|   | 
|   | 
| #===============================================================================  | 
|   | 
| #  @param index: Íæ¼ÒË÷Òý  | 
| #  @param clientData: ·â°ü½á¹¹Ìå  | 
| #  @param tick: Ê±¼ä´Á  | 
| #  @return: None  | 
| def OnWingJingLian(index, clientData, tick):  | 
|       | 
|     # ¸ù¾Ý²ß»®ÐèÒª,¿ÉÒÔÑ¡ÔñÊÇ·ñ¿ç·þ·þÎñÆ÷¹¦ÄÜÏÞÖÆ  | 
| #    if GameWorld.IsCrossServer():  | 
| #        return  | 
|       | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #»ñÈ¡·â°üÐÅÏ¢  | 
|     materialMessageList = clientData.WingIndexList  | 
|     #count = clientData.Count  | 
|     GameWorld.DebugLog("ÓðÒí¾«Á¶:WingIndexList=%s" % materialMessageList, curPlayer.GetPlayerID())  | 
|       | 
|     #Åжϵȼ¶ÊÇ·ñÂú×ã  | 
|     if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Wing):  | 
|         GameWorld.DebugLog("µÈ¼¶²»×㣬²»Äܾ«Á¶³á°ò")  | 
|         return  | 
|       | 
|     ##ÅжÏÊÇ·ñ×°±¸³á°ò retWing  | 
|     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)  | 
|     curWing = equipPack.GetAt(ShareDefine.retWing)  | 
|       | 
|     if not ItemCommon.CheckItemCanUse(curWing):  | 
|         GameWorld.Log("³á°ò²»ºÏ·¨£¬»òÕßûÓдø³á°ò")  | 
|         return  | 
|       | 
|     #Åжϵ±Ç°³á°òÊÇ·ñ¿ÉÒÔ¾«Á¶  | 
|     if not __WingCanJingLian(curWing):  | 
|         #Ìáʾµ±Ç°³á°ò¾«Á¶ÒѾ´ïµ½ÉÏÏÞ  | 
|         #PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")  | 
|         GameWorld.DebugLog("¸Ã³á°ò²»ÐèÒª¾«Á¶")  | 
|         return      | 
|       | 
|     materialInfo = __ReduceMaterial(curPlayer, curWing, materialMessageList)  | 
|     if not materialInfo:  | 
|         return  | 
|     totalPoint, materialItemDict = materialInfo  | 
|     if not totalPoint:  | 
|         GameWorld.DebugLog("ûÓо«Á¶Öµ")  | 
|         return  | 
|     WingProgressUP(curWing, totalPoint, materialItemDict, curPlayer)  | 
|     ChEquip.RefreshPlayerLingQiEquipAttr(curPlayer)  | 
|     PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()  | 
|     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_WingRefine, 1)  | 
|     return  | 
|   | 
| def __WingCanJingLian(curWing):  | 
|     #Åжϳá°òÊÇ·ñ¿ÉÒÔ¾«Á¶  | 
|     wingAttrIpyData = GetWingRefineAttrData(curWing.GetItemTypeID())  | 
|     if wingAttrIpyData == None:  | 
|         return False  | 
|     maxWingProgress = wingAttrIpyData.GetMaxRefineExp()  | 
|     curProgress = curWing.GetUserAttr(ShareDefine.Def_IudetWingProgressValue)  | 
|     return curProgress < maxWingProgress  | 
|   | 
|   | 
| #¿Û³ý¾«Á¶²ÄÁÏ  | 
| def __ReduceMaterial(curPlayer, curWing, materialMessageList):  | 
|     totalPoint = 0  | 
|     materialItemDict = {} # ÌØÊ⾫Á¶²ÄÁϸöÊýÐÅÏ¢ {itemID:¸öÊý, ...}  | 
|     itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|     needCount = 1  | 
|     wingClassLV = ItemCommon.GetItemClassLV(curWing)  | 
|     for index in materialMessageList:  | 
|         curItem = itemPack.GetAt(index)  | 
|         if not ItemCommon.CheckItemCanUse(curItem):  | 
|             GameWorld.DebugLog("Õâ¸ö¸ñ×ÓûÓкϷ¨²ÄÁÏ,index=%s" % index)  | 
|             continue  | 
|         curItemID = curItem.GetItemTypeID()  | 
|         wingAttrIpyData = IpyGameDataPY.GetIpyGameData("WingRefineExp", curItemID)  | 
|         if wingAttrIpyData == None:  | 
|             GameWorld.DebugLog("¸ÃÎïÆ·²»ÄÜ×÷ΪÓðÒí¾«Á¶µÄ²ÄÁÏ,index=%s,itemID=%s" % (index, curItemID))  | 
|             continue  | 
|         curItemCount = curItem.GetCount()  | 
|         if curItemCount < needCount:  | 
|             GameWorld.DebugLog("²ÄÁϲ»×ã")  | 
|             continue  | 
|           | 
|         point = 0  | 
|         # ¸ù¾Ý´úÊý³É³¤µÄ¾«Á¶²ÄÁÏ  | 
|         expDict = wingAttrIpyData.GetExpMaterial()  | 
|         if expDict:  | 
|             if wingClassLV not in expDict:  | 
|                 GameWorld.ErrLog("¾«Á¶²ÄÁÏûÓÐÅäÖöÔÓ¦³á°ò´úÊý¾«Á¶Öµ£¬ÎÞ·¨¾«Á¶!index=%s,curItemID=%s,wingClassLV=%s"   | 
|                                  % (index, curItemID, wingClassLV), curPlayer.GetPlayerID())  | 
|                 continue  | 
|             point += expDict[wingClassLV] * needCount  | 
|             materialItemDict[curItemID] = materialItemDict.get(curItemID, 0) + needCount  | 
|         else:  | 
|             point += random.randint(wingAttrIpyData.GetRandExpMin(), wingAttrIpyData.GetRandExpMax()) * needCount  | 
|         GameWorld.DebugLog("    index=%s,itemID=%s,baseExp=%s" % (index, curItemID, point))  | 
|           | 
|         if curItem.GetType() == ChConfig.Def_ItemType_retWing:  | 
|             wingItemExpInfo = GetWingItemChangeExp(curItem, wingClassLV)  | 
|             if not wingItemExpInfo:  | 
|                 GameWorld.ErrLog("³á°òÎïÆ·×ª»¯Îª¾«Á¶ÖµÒì³£,index=%s!" % index, curPlayer.GetPlayerID())  | 
|                 continue  | 
|             changeTagWingExp, materialItemDictEx = wingItemExpInfo  | 
|             for materialItemID, count in materialItemDictEx.items():  | 
|                 materialItemDict[materialItemID] = materialItemDict.get(materialItemID, 0) + count  | 
|             point += changeTagWingExp  | 
|               | 
|         totalPoint += point  | 
|         GameWorld.DebugLog("    ¾«Á¶ÐÅÏ¢: index=%s,curItemID=%s,point=%s,totalPoint=%s,materialItemDict=%s"   | 
|                            % (index, curItemID, point, totalPoint, materialItemDict))  | 
|         ItemCommon.DelItem(curPlayer, curItem, needCount, True, ChConfig.ItemDel_WingExp)  | 
|           | 
|     return totalPoint, materialItemDict  | 
|   | 
| def GetWingItemChangeExp(curItem, tagWingClassLV):  | 
|     '''»ñÈ¡³á°òÎïÆ·×ª»¯ÎªÄ¿±ê´úÊý³á°ò¾«Á¶Öµ  | 
|     @return: None-Òì³££¬Ö®ºóµÄ¹¦Äܲ»ÄÜ×ö´¦Àí  | 
|              ×ª»¯µÄ¾«Á¶Öµ, ÌØÊ⾫Á¶²ÄÁϼ°¸öÊý{itemID:¸öÊý, ...}  | 
|     '''  | 
|     curExp = curItem.GetUserAttr(ShareDefine.Def_IudetWingProgressValue)  | 
|     materialItemIDList = [curItem.GetUserAttrByIndex(ShareDefine.Def_IudetWingMaterialItemID, i) \  | 
|                           for i in range(curItem.GetUserAttrCount(ShareDefine.Def_IudetWingMaterialItemID))]  | 
|     if not materialItemIDList:  | 
|         return curExp, {}  | 
|       | 
|     materialItemCountList = [curItem.GetUserAttrByIndex(ShareDefine.Def_IudetWingMaterialItemCount, i) \  | 
|                              for i in range(curItem.GetUserAttrCount(ShareDefine.Def_IudetWingMaterialItemCount))]  | 
|     if len(materialItemIDList) != len(materialItemCountList):  | 
|         GameWorld.ErrLog("ÓðÒí¾«Á¶²ÄÁϼǼÒì³£!wingItemID=%s,UserData=%s" % (curItem.GetItemTypeID(), curItem.GetUserData()))  | 
|         return  | 
|       | 
|     curLVMaterialExp = 0  | 
|     tagLVMaterialExp = 0  | 
|     materialItemDict = {}  | 
|     curWingClassLV = ItemCommon.GetItemClassLV(curItem)  | 
|     for i, materialItemID in enumerate(materialItemIDList):  | 
|         wingAttrIpyData = IpyGameDataPY.GetIpyGameData("WingRefineExp", materialItemID)  | 
|         if wingAttrIpyData == None:  | 
|             GameWorld.ErrLog("¸ÃÎïÆ·ID·ÇÓðÒí¾«Á¶²ÄÁÏ!materialItemID=%s" % materialItemID)  | 
|             return  | 
|           | 
|         # ¸ù¾Ý´úÊý³É³¤µÄ¾«Á¶²ÄÁÏ  | 
|         expDict = wingAttrIpyData.GetExpMaterial()  | 
|         if not expDict:  | 
|             GameWorld.ErrLog("¾«Á¶²ÄÁÏûÓÐÅäÖôúÊý¶ÔÓ¦¾«Á¶Öµ!materialItemID=%s" % materialItemID)   | 
|             return  | 
|           | 
|         if curWingClassLV not in expDict or tagWingClassLV not in expDict:  | 
|             GameWorld.ErrLog("¾«Á¶²ÄÁÏûÓÐÅäÖôúÊý¶ÔÓ¦¾«Á¶Öµ!materialItemID=%s,curWingClassLV=%s,tagWingClassLV=%s,expDict=%s"   | 
|                              % (materialItemID, curWingClassLV, tagWingClassLV, expDict))   | 
|             return  | 
|         materialItemCount = materialItemCountList[i]  | 
|         curLVMaterialExp += (expDict[curWingClassLV] * materialItemCount)  | 
|         tagLVMaterialExp += (expDict[tagWingClassLV] * materialItemCount)  | 
|         materialItemDict[materialItemID] = materialItemCount  | 
|           | 
|     curWingBaseExp = max(0, curExp - curLVMaterialExp)  | 
|     changeTagWingExp = curWingBaseExp + tagLVMaterialExp # ×ª»¯Ä¿±ê´úÊý³á°ò¾«Á¶Öµ  | 
|     GameWorld.DebugLog("    ³á°òת»¯Îª¾«Á¶Öµ:curExp=%s,curWingClassLV-EXP=(%s-%s),tagWingClassLV-EXP=(%s-%s),changeTagWingExp=%s,materialItemDict=%s"   | 
|                        % (curExp, curWingClassLV, curLVMaterialExp, tagWingClassLV, tagLVMaterialExp, changeTagWingExp, materialItemDict))  | 
|     return changeTagWingExp, materialItemDict  | 
|   | 
| def WingProgressUP(curWing, addExp, materialItemDict={}, curPlayer=None):  | 
|     #Ôö¼Ó¾«Á¶Öµ  | 
|     if not addExp:  | 
|         return  | 
|       | 
|     wingProgress = curWing.GetUserAttr(ShareDefine.Def_IudetWingProgressValue)  | 
|     updWingProgress = wingProgress + addExp   | 
|     curWing.SetUserAttr(ShareDefine.Def_IudetWingProgressValue, updWingProgress)  | 
|       | 
|     GameWorld.DebugLog("Ôö¼Ó³á°ò¾«Á¶Öµ: curExp=%s,addExp=%s,updExp=%s,materialItemDict=%s"   | 
|                        % (wingProgress, addExp, updWingProgress, materialItemDict))  | 
|     # ¸üÐÂÌØÊâ²ÄÁϸöÊý  | 
|     if materialItemDict:  | 
|         materialItemIDList = [curWing.GetUserAttrByIndex(ShareDefine.Def_IudetWingMaterialItemID, i) \  | 
|                               for i in range(curWing.GetUserAttrCount(ShareDefine.Def_IudetWingMaterialItemID))]  | 
|         for materialItemID, materialItemCount in materialItemDict.items():  | 
|             if materialItemID in materialItemIDList:  | 
|                 index = materialItemIDList.index(materialItemID)  | 
|                 updCount = curWing.GetUserAttrByIndex(ShareDefine.Def_IudetWingMaterialItemCount, index) + materialItemCount  | 
|                 curWing.UpdataUserAttrByIndex(ShareDefine.Def_IudetWingMaterialItemCount, index, updCount)  | 
|                 GameWorld.DebugLog("    ¸üгá°òÌØÊ⾫Á¶²ÄÁϸöÊý: materialItemID=%s,updCount=%s" % (materialItemID, updCount))  | 
|             else:  | 
|                 curWing.AddUserAttr(ShareDefine.Def_IudetWingMaterialItemID, materialItemID)  | 
|                 curWing.AddUserAttr(ShareDefine.Def_IudetWingMaterialItemCount, materialItemCount)  | 
|                 GameWorld.DebugLog("    ÐÂÔö³á°òÌØÊ⾫Á¶²ÄÁϸöÊý: materialItemID=%s,materialItemCount=%s" % (materialItemID, materialItemCount))  | 
|                   | 
|     UpdWingColor(curPlayer, curWing, wingProgress, updWingProgress)  | 
|     return  | 
|   | 
| def UpdWingColor(curPlayer, curWing, wingProgress, updWingProgress):  | 
|     curItemID = curWing.GetItemTypeID()  | 
|     wingAttrIpyData = GetWingRefineAttrData(curItemID)  | 
|     if not wingAttrIpyData:  | 
|         return  | 
|       | 
|     # ¸üгá°ò¾«Á¶ÑÕÉ«  | 
|     wingColorDict = wingAttrIpyData.GetItemColorInfo()  | 
|     curColor = curWing.GetUserAttr(ShareDefine.Def_IudetItemColor)  | 
|     #isColorChange = False  | 
|     for color in wingColorDict:  | 
|         if updWingProgress >= wingColorDict[color] and color > curColor:  | 
|             curColor = color  | 
|             curWing.SetUserAttr(ShareDefine.Def_IudetItemColor, curColor)  | 
|             GameWorld.DebugLog("    ¸üгá°òÑÕÉ«: updWingProgress=%s,curColor=%s" % (updWingProgress, curColor))  | 
|             #isColorChange = True  | 
|     maxRefineExp = wingAttrIpyData.GetMaxRefineExp()  | 
|     if curPlayer and wingProgress < maxRefineExp <= updWingProgress:  | 
|         PlayerControl.WorldNotify(0, "WingsRefinePerfect", [curPlayer.GetPlayerName(), curItemID, curWing.GetUserData()])  | 
|     #if curPlayer and isColorChange:  | 
|     #    PlayerSuccess.DoEquipSuccessLogic(curPlayer)  | 
|     return  | 
|   | 
| def GetWingRefineAttrData(itemID):  | 
|     wingData = GameWorld.GetGameData().GetItemByTypeID(itemID)  | 
|     if not wingData:  | 
|         return  | 
|     wingClassLV = ItemCommon.GetItemClassLV(wingData)  | 
|     return IpyGameDataPY.GetIpyGameDataNotLog("WingRefineAttr", wingClassLV)  | 
|   | 
| def GetWingProgressPerValueByID(itemID, per):  | 
|     ## »ñÈ¡³á°ò¾«Á¶°Ù·Ö±È¶ÔÓ¦µÄ¾«Á¶Öµ  | 
|     if per <= 0:  | 
|         return 0  | 
|     wingAttrIpyData = GetWingRefineAttrData(itemID)  | 
|     if not wingAttrIpyData:  | 
|         return 0  | 
|     return int(wingAttrIpyData.GetMaxRefineExp() * per / 100.0)  | 
|   | 
| ## ³á°ò¹¦ÄÜ¿ªÆô  | 
| def DoWingOpen(curPlayer):  | 
|     GameWorld.DebugLog("³á°ò¾«Á¶¿ªÆô")  | 
|     return True  | 
|               | 
|       | 
| ## ¼ÆËãÊôÐÔ  | 
| #  @param curPlayer Íæ¼Ò  | 
| #  @param allAttrList ÊôÐÔÁÐ±í  | 
| #  @return None  | 
| def CalcWingAttrEx(curPlayer, curWing, allAttrList):  | 
|       | 
|     # ¾«Á¶ÊôÐÔ  | 
|     wingAttrIpyData = GetWingRefineAttrData(curWing.GetItemTypeID())  | 
|     if wingAttrIpyData:  | 
|         curProgress = curWing.GetUserAttr(ShareDefine.Def_IudetWingProgressValue)  | 
|         maxWingProgress = wingAttrIpyData.GetMaxRefineExp()  | 
|         fujiaValueDict = wingAttrIpyData.GetAttrInfo()  | 
|           | 
|         rate = round(float(curProgress) / float(maxWingProgress), 3) if curProgress <= maxWingProgress else 1  | 
|       | 
|         for effID, value in fujiaValueDict.items():  | 
|             PlayerControl.CalcAttrDict_Type(effID, int(value * rate), allAttrList)  | 
|     #GameWorld.DebugLog("    ¾«Á¶ÊôÐÔ: %s" % allAttrList)  | 
|     return  | 
|   | 
|    | 
|       | 
|       | 
|       | 
|       | 
|       | 
|       | 
|   | 
|   |