#!/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