#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package Event.EventSrc.Operate_EquipStar # # @todo:¹«¹²²¿Î»ÐÇÊý # @author xdh # @date 2019-3-1 # @version 1.0 # # ÏêϸÃèÊö: ¹«¹²²¿Î»ÐÇÊý # # #--------------------------------------------------------------------- #"""Version = 2019-3-1 18:00""" #--------------------------------------------------------------------- import ItemCommon import ShareDefine import PlayerControl import IPY_GameWorld import DataRecordPack import IpyGameDataPY import GameWorld import EventShell import ChConfig import ChEquip #------------------------------------------------------------------------------------------- #=============================================================================== #// A5 C5 ×°±¸²¿Î»ÉýÐÇ #tagCMEquipPartStarUp #struct tagCMEquipPartStarUp #{ # tagHead Head; # WORD EquipPackIndex; // ²¿Î»¸ñ×ÓË÷Òý # BYTE CostEquipCnt; // ×°±¸¸öÊý # WORD CostEquipIndex[CostEquipCnt]; // ×°±¸Ë÷Òý # DWORD CostEquipID[CostEquipCnt]; // ×°±¸ÎïÆ·ID #}; #=============================================================================== ## ²¿Î»ÉýÐÇ # @param playerIndex: Íæ¼Ò # @param clientData: ·â°ü # @param tick: µ±Ç°Ê±¼ä # @return None def OnEquipPartStarUp(playerIndex, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex) playerID = curPlayer.GetPlayerID() equipPackIndex = clientData.EquipPackIndex packType = IPY_GameWorld.rptEquip if packType not in ChConfig.Pack_EquipPart_CanPlusStar: return ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':equipPackIndex}) if not ipyData: return classLV = ipyData.GetClassLV() equipPlace = ipyData.GetEquipPlace() placeList = ChConfig.Pack_EquipPart_CanPlusStar[packType] if equipPlace not in placeList: GameWorld.Log(" equipPlace %s not in ChConfig.Pack_EquipPart_CanPlusStar" % equipPlace, playerID) return # µ±Ç°×°±¸µÈ¼¶ÊÇ·ñµ½´ï×î¸ßµÈ¼¶ curPack = curPlayer.GetItemManager().GetPack(packType) curEquip = curPack.GetAt(equipPackIndex) if not curEquip or curEquip.IsEmpty(): GameWorld.DebugLog("OnEquipPartStarUp() equip is empty") return maxStar = ItemCommon.GetItemMaxStar(curEquip) curPartStar = ChEquip.GetEquipPartStar(curPlayer, equipPackIndex) if curPartStar >= maxStar: GameWorld.Log("OnEquipPartStarUp:curPartStar(%s) >= maxStar(%s)" % (curPartStar, maxStar), playerID) return # ÉýÐÇ´¦Àí result = DoLogic_EquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, clientData) if result == ChConfig.Def_ComposeState_None: return updPartStar = ChEquip.GetEquipPartStar(curPlayer, equipPackIndex) GameWorld.DebugLog(" ×°±¸ÉýÐÇ equipPackIndex=%s result=%s,curPartStar=%s,updPartStar=%s" % (equipPackIndex, result, curPartStar, updPartStar), playerID) if result == ChConfig.Def_ComposeState_Sucess: # ÐǼ¶±ä¸üʱ´¦Àí #Ë¢ÐÂÊôÐÔ ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV) playControl = PlayerControl.PlayerControl(curPlayer) playControl.RefreshPlayerAttrState() if updPartStar in IpyGameDataPY.GetFuncEvalCfg('EquipPartStarNotify'): itemID = curEquip.GetItemTypeID() userData = curEquip.GetUserData() guid = ItemCommon.CacheNotifyEquipDetailInfo(curPlayer, curEquip) msgParamList = [curPlayer.GetPlayerName(), itemID, userData, guid, updPartStar] PlayerControl.WorldNotify(0, "StarLevelUp", msgParamList) EventShell.EventRespons_EquipStarUp(curPlayer) return ## ¿ªÊ¼×°±¸ÉýÐÇ # @param index Ϊװ±¸Î» # @return def DoLogic_EquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, clientData): result = ChConfig.Def_ComposeState_None nextStar = curPartStar + 1 ipyData = IpyGameDataPY.GetIpyGameData("EquipStarUp", classLV, equipPlace, nextStar) if not ipyData: return result costEquipCnt = ipyData.GetCostEquipCnt() if clientData.CostEquipCnt < costEquipCnt: GameWorld.DebugLog(' ¿ªÊ¼×°±¸ÉýÐÇ,×°±¸²ÄÁϲ»×ã %s' % costEquipCnt) return result costEquipPlaceList = ipyData.GetCostEquipPlace() costEquipColorList = ipyData.GetCostEquipColor() isJobLimit = ipyData.GetIsJobLimit() suitTotalRate = ipyData.GetSuitTotalRate() itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) delEquipIndexList = [] totalEquipStars = ChEquip.GetTotalEquipStars(curPlayer) if not costEquipCnt: curRate = suitTotalRate / 2 else: singleSuitRate = float(suitTotalRate) / costEquipCnt curRate = 0 #³É¹¦¸ÅÂÊ for i, index in enumerate(clientData.CostEquipIndex): costEquip = itemPack.GetAt(index) if not costEquip or costEquip.IsEmpty(): return result equipID = costEquip.GetItemTypeID() if equipID != clientData.CostEquipID[i]: GameWorld.ErrLog(' ×°±¸ÉýÐÇ ¿Í»§¶Ë·¢µÄÎïÆ·Ë÷ÒýÓëʵ¼ÊÎïÆ·ID²»¶ÔÓ¦ index=%s,eatItemID=%s,wantEatItemID=%s' % (index, equipID, clientData.CostEquipID[i])) return result if costEquip.GetItemColor() not in costEquipColorList: return result if costEquip.GetEquipPlace() not in costEquipPlaceList: return result if isJobLimit and not ItemCommon.CheckJob(curPlayer, costEquip): return result delEquipIndexList.append(index) isSuite = costEquip.GetSuiteID() addRate = singleSuitRate if isSuite else singleSuitRate / 2 curRate += addRate if totalEquipStars < IpyGameDataPY.GetFuncCfg('EquipStarCustomized'): curRate = 100 if curRate <= 0: GameWorld.Log('×°±¸ÉýÐÇÒì³£ ¸ÅÂÊΪ0£¡£¡equipPackIndex=%s'%equipPackIndex) return result #ÅÐ¶ÏÆÕͨÎïÆ·²ÄÁÏ costItemDict = ipyData.GetCostItemDict() if costItemDict: delItemDict = {} for itemID, itemCnt in costItemDict.items(): hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemID, itemPack, itemCnt) if not hasEnough: return result delItemDict[tuple(indexList)] = itemCnt for itemIndexList, delCnt in delItemDict.items(): ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, delCnt, True, ChConfig.ItemDel_EquipStarUp) #¿Û×°±¸ ItemCommon.ReduceItem(curPlayer, itemPack, delEquipIndexList, len(delEquipIndexList), True, ChConfig.ItemDel_EquipStarUp) isOK = GameWorld.CanHappen(curRate, 100) if isOK: ChEquip.SetEquipPartStar(curPlayer, equipPackIndex, nextStar) ChEquip.NotifyEquipPartStar(curPlayer, equipPackIndex) result = ChConfig.Def_ComposeState_Sucess else: result = ChConfig.Def_ComposeState_Fail curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitEquipStarUp, result) drDict = {"PlayerID":curPlayer.GetPlayerID(), "AccID":curPlayer.GetAccID(), "classLV":classLV, "equipPlace":equipPlace, "IsSuccess":isOK, "curRate":curRate, "nextStar":nextStar, 'totalEquipStars':totalEquipStars} DataRecordPack.SendEventPack("EquipStarUp", drDict, curPlayer) return result