#!/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 PlayerAuctionHouse import IpyGameDataPY import GameWorld import EventShell import ChConfig import ChEquip import math #------------------------------------------------------------------------------------------- #// A5 C5 ×°±¸²¿Î»ÉýÐÇ #tagCMEquipPartStarUp # #struct tagCMEquipPartStarUp #{ # tagHead Head; # WORD EquipPackIndex; // ²¿Î»¸ñ×ÓË÷Òý # BYTE CostEquipCnt; // ×°±¸¸öÊý # WORD CostEquipIndex[CostEquipCnt]; // ×°±¸Ë÷Òý # DWORD CostEquipID[CostEquipCnt]; // ×°±¸ÎïÆ·ID # BYTE AutoBuy; // ×Ô¶¯¹ºÂò 0-²»×Ô¶¯¹ºÂò£¬1-×Ô¶¯¹ºÂò²¢ÉýÐÇ£¬2-×Ô¶¯¹ºÂòÔ¤ÀÀ(δÂú¸ÅÂÊʱԤÀÀÏûºÄʱʹÓÃ) #}; 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 # µ±Ç°×°±¸µÈ¼¶ÊÇ·ñµ½´ï×î¸ßµÈ¼¶ equipPack = curPlayer.GetItemManager().GetPack(packType) curEquip = equipPack.GetAt(equipPackIndex) if not ItemCommon.CheckItemCanUse(curEquip): 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 itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) costEquipIndexList = clientData.CostEquipIndex costEquipIDList = clientData.CostEquipID autoBuy = clientData.AutoBuy checkCostResult = __CheckCostInfo(curPlayer, classLV, equipPlace, curPartStar, costEquipIndexList, costEquipIDList, itemPack, autoBuy) if not checkCostResult: return curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney = checkCostResult if autoBuy: isAutoBuyPreview = autoBuy == 2 # ¸ÅÂÊδÂú ÇÒ ×Ô¶¯¹ºÂò£¬ ÔòÐèÒªÖ´ÐÐÅÄÂôÐйºÂò×°±¸ if curRate < 100: playerGoldPaper = curPlayer.GetGoldPaper() queryData = [classLV, equipPlace, curPartStar, equipPackIndex, isAutoBuyPreview, curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney, playerGoldPaper] PlayerAuctionHouse.QueryGameServer_AuctionHouse(playerID, "EquipStarAutoBuy", queryData) return if lackItemCostMoney: if isAutoBuyPreview: # Âú¸ÅÂÊʱ×Ô¶¯¹ºÂò±ØÒª²ÄÁϵģ¬Ôݲ»´¦Àí£¬Ç°¶Ë×Ô¼ºÅжϾÍÐÐ return if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, lackItemCostMoney): GameWorld.DebugLog("×Ô¶¯¹ºÂò±ØÒªÎïÆ·»õ±Ò²»×㣬ÎÞ·¨ÉýÐÇ! %s" % lackItemCostMoney, playerID) return elif lackItemCostMoney: GameWorld.DebugLog("ȱÉÙ±ØÒªÎïÆ·£¬²»×Ô¶¯¹ºÂò£¬ÎÞ·¨ÉýÐÇ! %s" % lackItemCostMoney, playerID) return # ÉýÐÇ´¦Àí buyEquipCostMoney = 0 __DoEquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney, buyEquipCostMoney) return def GameServer_EquipStarAutoBuy(curPlayer, result): ## GameServer×Ô¶¯¹ºÂòÅÄÆ·½á¹û·µ»Ø classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney, buyEquipCostMoney = result __DoEquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney, buyEquipCostMoney) return def __DoEquipStarUp(curPlayer, classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney, buyEquipCostMoney): ## Ö´ÐÐ×°±¸²¿Î»ÉýÐÇ playerID = curPlayer.GetPlayerID() #×Ô¶¯¹ºÂò»õ±Ò costMoneyTotal = lackItemCostMoney + buyEquipCostMoney if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, costMoneyTotal): return nextStar = curPartStar + 1 totalEquipStars = ChEquip.GetTotalEquipStars(curPlayer) if totalEquipStars < IpyGameDataPY.GetFuncCfg('EquipStarCustomized'): curRate = 100 isOK = GameWorld.CanHappen(curRate, 100) GameWorld.DebugLog("×°±¸ÉýÐÇ×îÖÕ×ܸÅÂÊ: %s, isOK=%s, lackItemCostMoney=%s,buyEquipCostMoney=%s" % (curRate, isOK, lackItemCostMoney, buyEquipCostMoney), playerID) itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) #¿Û²ÄÁÏÎïÆ· for indexList, delCount in delItemInfoList: ItemCommon.ReduceItem(curPlayer, itemPack, indexList, delCount, True, ChConfig.ItemDel_EquipStarUp) ItemCommon.ReduceItem(curPlayer, itemPack, delEquipIndexList, len(delEquipIndexList), True, ChConfig.ItemDel_EquipStarUp) drDict = {"PlayerID":playerID, "AccID":curPlayer.GetAccID(), "classLV":classLV, "equipPlace":equipPlace, "IsSuccess":isOK, "curRate":curRate, "nextStar":nextStar, 'totalEquipStars':totalEquipStars, "lackItemCostMoney":lackItemCostMoney, "buyEquipCostMoney":buyEquipCostMoney} if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, costMoneyTotal, ChConfig.Def_Cost_EquipStar, drDict): return 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) DataRecordPack.SendEventPack("EquipStarUp", drDict, curPlayer) if not isOK: return EventShell.EventRespons_EquipStarUp(curPlayer) updPartStar = ChEquip.GetEquipPartStar(curPlayer, equipPackIndex) GameWorld.DebugLog(" ×°±¸ÉýÐÇ equipPackIndex=%s result=%s,curPartStar=%s,updPartStar=%s" % (equipPackIndex, result, curPartStar, updPartStar), playerID) # ÐǼ¶±ä¸üʱ´¦Àí # Ë¢ÐÂÊôÐÔ ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV) playControl = PlayerControl.PlayerControl(curPlayer) playControl.RefreshPlayerAttrState() if updPartStar in IpyGameDataPY.GetFuncEvalCfg('EquipPartStarNotify'): equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip) curEquip = equipPack.GetAt(equipPackIndex) if ItemCommon.CheckItemCanUse(curEquip): itemID = curEquip.GetItemTypeID() userData = curEquip.GetUserData() guid = ItemCommon.CacheNotifyEquipDetailInfo(curPlayer, curEquip) msgParamList = [curPlayer.GetPlayerName(), itemID, userData, guid, updPartStar] PlayerControl.WorldNotify(0, "StarLevelUp", msgParamList) return def __CheckCostInfo(curPlayer, classLV, equipPlace, curPartStar, costEquipIndexList, costEquipIDList, itemPack, isAutoBuy): nextStar = curPartStar + 1 ipyData = IpyGameDataPY.GetIpyGameData("EquipStarUp", classLV, equipPlace, nextStar) if not ipyData: return costEquipCnt = ipyData.GetCostEquipCnt() # ÊÇ·ñÏûºÄ×°±¸ costEquipPlaceList = ipyData.GetCostEquipPlace() costEquipColorList = ipyData.GetCostEquipColor() isJobLimit = ipyData.GetIsJobLimit() delEquipIndexList = [] totalEquipStars = ChEquip.GetTotalEquipStars(curPlayer) if not costEquipCnt: curRate = 100 # ²»ÓÃÏûºÄ×°±¸µÄĬÈÏÂú¸ÅÂÊ else: curRate = 0 #³É¹¦¸ÅÂÊ diffClassChangeRatePerInfo = IpyGameDataPY.GetFuncEvalCfg("EquipStarRate", 1) unSuitRateRange = IpyGameDataPY.GetFuncEvalCfg("EquipStarRate", 2) suitRateRange = IpyGameDataPY.GetFuncEvalCfg("EquipStarRate", 3) if len(diffClassChangeRatePerInfo) != 2 or len(unSuitRateRange) != 2 or len(suitRateRange) != 2: GameWorld.ErrLog('ÉýÐDz»Í¬½×¸ÅÂÊÅäÖôíÎó£¡') return for i, index in enumerate(costEquipIndexList): costEquip = itemPack.GetAt(index) if not costEquip or costEquip.IsEmpty(): return equipID = costEquip.GetItemTypeID() if equipID != costEquipIDList[i]: GameWorld.ErrLog(' ×°±¸ÉýÐÇ ¿Í»§¶Ë·¢µÄÎïÆ·Ë÷ÒýÓëʵ¼ÊÎïÆ·ID²»¶ÔÓ¦ index=%s,eatItemID=%s,wantEatItemID=%s' % (index, equipID, costEquipIDList[i])) return costEquipColor = costEquip.GetItemColor() costEquipPlace = costEquip.GetEquipPlace() if costEquipColor not in costEquipColorList: return if costEquipPlace not in costEquipPlaceList: return if isJobLimit and not ItemCommon.CheckJob(curPlayer, costEquip): return if costEquip.GetSuiteID(): baseRate = ipyData.GetSuitRate() minRate, maxRate = suitRateRange else: baseRate = ipyData.GetUnSuitRate() minRate, maxRate = unSuitRateRange GameWorld.DebugLog("equipID=%s,baseRate=%s,minRate=%s,maxRate=%s" % (equipID, baseRate, minRate, maxRate)) addRate = baseRate costClassLV = ItemCommon.GetItemClassLV(costEquip) #ÍÌ¸ß½× if costClassLV > classLV: diffClassChangeRatePer = diffClassChangeRatePerInfo[0] * (costClassLV - classLV) addRate = int(math.ceil(round(baseRate * (100 + diffClassChangeRatePer) / 100.0, 2))) GameWorld.DebugLog(" ÍÌ¸ß½× costClassLV=%s,classLV=%s,diffClassChangeRatePer=%s,addRate=%s" % (costClassLV, classLV, diffClassChangeRatePer, addRate)) #ÍÌµÍ½× elif costClassLV < classLV: diffClassChangeRatePer = diffClassChangeRatePerInfo[1] * (classLV - costClassLV) addRate = int(math.ceil(round(baseRate * (100 - diffClassChangeRatePer) / 100.0, 2))) GameWorld.DebugLog(" ÍÌµÍ½× costClassLV=%s,classLV=%s,diffClassChangeRatePer=%s,addRate=%s" % (costClassLV, classLV, diffClassChangeRatePer, addRate)) addRate = max(minRate, min(addRate, maxRate)) curRate += addRate GameWorld.DebugLog(" ±¾¼þ×°±¸Ôö¼Ó¸ÅÂÊ=%s,µ±Ç°×ܸÅÂÊ=%s" % (addRate, curRate)) delEquipIndexList.append(index) delItemInfoList = [] lackItemCostMoney = 0 costItemDict = ipyData.GetCostItemDict() if costItemDict: for itemID, itemCnt in costItemDict.items(): hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemID, itemPack, itemCnt) if not hasEnough: if not isAutoBuy: GameWorld.DebugLog(" ȱÉÙ±ØÒªÎïÆ·£¬²»×Ô¶¯¹ºÂò£¡itemID=%s,lackCnt=%s" % (itemID, lackCnt)) return itemGoldPaper = ItemCommon.GetShopItemPrice(itemID, IPY_GameWorld.TYPE_Price_Gold_Paper) if not itemGoldPaper: GameWorld.DebugLog(" ÕÒ²»µ½ÎïÆ·×Ô¶¯¹ºÂòÏûºÄ»õ±Ò£¡itemID=%s,lackCnt=%s" % (itemID, lackCnt)) return lackItemCostMoney += itemGoldPaper * lackCnt delCount = itemCnt - lackCnt GameWorld.DebugLog(" ȱÉÙ±ØÒªÎïÆ·: itemID=%s,lackMoney(%s)*Count(%s)=%s" % (itemID, itemGoldPaper, lackCnt, itemGoldPaper * lackCnt)) else: delCount = itemCnt delItemInfoList.append([indexList, delCount]) if totalEquipStars < IpyGameDataPY.GetFuncCfg('EquipStarCustomized'): curRate = 100 #if curRate <= 0: # GameWorld.ErrLog('×°±¸ÉýÐÇÒì³£ ¸ÅÂÊΪ0£¡£¡classLV=%s, equipPlace=%s' % (classLV, equipPlace)) # return if curRate >= IpyGameDataPY.GetFuncCfg("EquipStarRate", 4): # ÓÅ»¯¸ß¸ÅÂÊÌåÑé curRate = 100 return curRate, delEquipIndexList, delItemInfoList, lackItemCostMoney