#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerTreasure # # @todo:Ѱ±¦ # @author hxp # @date 2018-04-28 # @version 1.0 # # ÏêϸÃèÊö: ÊÖÓÎѰ±¦, Ö§³Öµ¥³é¡¢Á¬³é # #------------------------------------------------------------------------------- #"""Version = 2018-04-28 16:00""" #------------------------------------------------------------------------------- import GameWorld import PlayerRune import ShareDefine import GameFuncComm import IpyGameDataPY import IPY_GameWorld import FormulaControl import ChPyNetSendPack import PlayerControl import ItemControler import NetPackCommon import PlayerBossReborn import PlayerFeastTravel import PlayerFairyCeremony import PlayerNewFairyCeremony import ItemCommon import ChConfig import random import time TreasureTypeList = ( TreasureType_Jipin, # ¼«Æ·Ñ°±¦ 1 TreasureType_Rune, # ·ûӡѰ±¦ 2 TreasureType_Jueshi, # ¾øÊÀ¾ý±¦ 3 TreasureType_GatherTheSoul, # ¾Û»êÁÔħ 4 ) = range(1, 1 + 4) def DoTreasureOpen(curPlayer): ## Ѱ±¦¿ªÆô # ÉèÖÃÃâ·ÑѰ±¦ treasureTypeList = GetTreasureTypeList() for treasureType in treasureTypeList: freeTimeCDList = IpyGameDataPY.GetFuncEvalCfg("TreasureSet1%s" % treasureType, 4) for i, minute in enumerate(freeTimeCDList): if not minute: continue PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeTime % (treasureType, i), int(time.time()) - minute * 60) Sync_TreasureInfo(curPlayer) return def OnTreasureLogin(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Treasure): return Sync_TreasureInfo(curPlayer) return #// A5 68 ÇëÇóѰ±¦ #tagCMRequestTreasure # #struct tagCMRequestTreasure #{ # tagHead Head; # BYTE TreasureType; //Ѱ±¦ÀàÐÍ # BYTE TreasureIndex; //Ѱ±¦Ë÷Òý # BYTE CostType; //ÏûºÄÀàÐÍ£º0-ĬÈÏÏÉÓñ£»1-Ãâ·Ñ´ÎÊý£»2-Ѱ±¦µÀ¾ß #}; def OnRequestTreasure(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerLV = curPlayer.GetLV() playerID = curPlayer.GetPlayerID() treasureType = clientData.TreasureType treasureIndex = clientData.TreasureIndex costType = clientData.CostType isFreeType = 1 if costType == 1 else 0 GameWorld.DebugLog("Íæ¼ÒѰ±¦: treasureType=%s,treasureIndex=%s,costType=%s,playerLV=%s" % (treasureType, treasureIndex, costType, playerLV), playerID) TreasureSet1 = "TreasureSet1%s" % treasureType TreasureSet2 = "TreasureSet2%s" % treasureType treasureCountList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 1) # Ѱ±¦»ñµÃ¸öÊýÁбí if not treasureCountList: GameWorld.DebugLog("ûÓÐѰ±¦´ÎÊýÁбíÅäÖÃ!", playerID) return if treasureIndex < 0 or treasureIndex >= len(treasureCountList): GameWorld.ErrLog("Ѱ±¦´ÎÊýË÷Òý²»´æÔÚ!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) return treasureCount = treasureCountList[treasureIndex] if not treasureCount: GameWorld.DebugLog("ûÓÐѰ±¦´ÎÊýÅäÖÃ!", playerID) return packType = ShareDefine.rptTreasure #if treasureType == 2: # packType = ShareDefine.rptRune if treasureType in [TreasureType_GatherTheSoul]: packType = IPY_GameWorld.rptItem if not ItemCommon.CheckPackHasSpace(curPlayer, packType, True): GameWorld.DebugLog("¶ÔӦѰ±¦±³°üûÓпոñ×Ó!packType=%s" % packType, playerID) return # Ãâ·Ñ´ÎÊý if costType == 1: freeCountCDList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 4) # Ãâ·Ñ´ÎÊýCDʱ¼äÁбí, ·Ö freeCountCD = freeCountCDList[treasureIndex] * 60 if not freeCountCD: GameWorld.ErrLog("¸ÃѰ±¦ÀàÐÍË÷Òý²»Ö§³ÖÃâ·Ñ´ÎÊýѰ±¦!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) return curTime = int(time.time()) freeTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeTime % (treasureType, treasureIndex)) if curTime - freeTime < freeCountCD: GameWorld.DebugLog("Ãâ·ÑѰ±¦CDʱ¼äδµ½£¬ÎÞ·¨Ê¹ÓÃÃâ·ÑѰ±¦!curTime=%s,freeTime=%s, %s < freeCountCD(%s)" % (curTime, freeTime, curTime - freeTime, freeCountCD), playerID) return # Ѱ±¦µÀ¾ß, ĿǰĬÈÏÏûºÄ1¸ö elif costType == 2: costItemList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 3) # ÏûºÄµÀ¾ßÎïÆ·IDÁбí if not costItemList: GameWorld.ErrLog("¸ÃѰ±¦ÀàÐÍË÷Òý²»Ö§³ÖÏûºÄµÀ¾ßѰ±¦!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) return costItemID, costItemNeedCount = costItemList[treasureIndex] if not costItemID or not costItemNeedCount: return costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID) lackCount = max(0, costItemNeedCount - bindCnt - unBindCnt) delCostItemCount = costItemNeedCount - lackCount lackCountCostMoney = 0 if lackCount > 0: lackCountCostMoney = ItemCommon.GetAutoBuyItemNeedGold({costItemID:lackCount}) if lackCountCostMoney: moneyType = IPY_GameWorld.TYPE_Price_Gold_Paper infoDict = {ChConfig.Def_Cost_Reason_SonKey:costItemID} if not PlayerControl.HaveMoney(curPlayer, moneyType, lackCountCostMoney): return else: GameWorld.DebugLog("Ѱ±¦ÏûºÄµÀ¾ß²»×ã!costItemID=%s,costItemNeedCount=%s,bindCnt=%s,unBindCnt=%s" % (costItemID, costItemNeedCount, bindCnt, unBindCnt), playerID) return # ÏÉÓñѰ±¦ else: costGoldList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 2) # ÏûºÄ»õ±ÒÁбí costGoldType = IpyGameDataPY.GetFuncCfg(TreasureSet2, 4) # ÏûºÄ»õ±ÒÀàÐÍ costGold = costGoldList[treasureIndex] if not costGold: GameWorld.ErrLog("¸ÃѰ±¦ÀàÐÍË÷Òý²»Ö§³ÖÏûºÄÏÉÓñѰ±¦!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) return if not PlayerControl.HaveMoney(curPlayer, costGoldType, costGold): return ipyData = IpyGameDataPY.InterpolationSearch("TreasureHouse", "MinLV", playerLV, {"TreasureType":treasureType}) if not ipyData: GameWorld.ErrLog("ÕÒ²»µ½¸ÃµÈ¼¶¶ÔӦѰ±¦¿âÅäÖÃ!treasureType=%s,curLV=%s" % (treasureType, curPlayer.GetLV()), playerID) return luckFormula = IpyGameDataPY.GetFuncCfg(TreasureSet2, 1) # ÐÒÔËÎïÆ·¸ÅÂʹ«Ê½ addLuck = IpyGameDataPY.GetFuncEvalCfg(TreasureSet2, 2)[treasureIndex] # Ôö¼ÓÐÒÔËÖµ maxLuck = IpyGameDataPY.GetFuncCfg(TreasureSet2, 3) # ÂúÐÒÔËÖµ curLuck = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (treasureType)) # µ±Ç°ÐÒÔËÖµ updLuck = curLuck + addLuck commItemRateList = GetUpdLuckyItemRateList(ipyData, curLuck, luckFormula, costType) # ³£¹æ²ú³öÎïÆ·¸ñ×Ó±ýͼ£¬ÐÒÔËÎïÆ·¸ÅÂÊÒѱä¸ü curTreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (treasureType, isFreeType)) # µ±Ç°ÒÑѰ±¦´ÎÊý updTreasureCount = curTreasureCount + treasureCount beSureCountDict = ipyData.GetFreeGridItemRateList3() if isFreeType else ipyData.GetGridItemRateList3() # µÚx´Î±Ø³ö²ú³ö¸ñ×Ó±àºÅ±ýͼ GameWorld.DebugLog("ÒѾ­Ñ°±¦´ÎÊý=%s,µ±Ç°ÐÒÔË=%s,commItemRateList=%s" % (curTreasureCount, curLuck, commItemRateList), playerID) addScore = 0 if isFreeType else IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 5)[treasureIndex] # Ôö¼Ó»ý·Ö ensureCount = IpyGameDataPY.GetFuncEvalCfg("TreasureSet", 1, {})[isFreeType] # ÿ¶àÉٴδ¥·¢±£µ×²ú³ö¿â ensureRateList = ipyData.GetFreeGridItemRateList2() if isFreeType else ipyData.GetGridItemRateList2() goodGridNumList = [ipyData.GetLuckyGridNum()] # ºÃÎïÆ·¸ñ×Ó±àºÅ (ÐÒÔËÎïÆ· + ±Ø³ö + ±£µ×) for gridRateList in beSureCountDict.values(): for gridRateInfo in gridRateList: goodGridNumList.append(gridRateInfo[1]) for gridRateInfo in ensureRateList: goodGridNumList.append(gridRateInfo[1]) notifyGridNumList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet2, 5) # ¶îÍâÐèÒª¹ã²¥µÄ¸ñ×Ó£¬ÐÒÔ˱سö¡¢´ÎÊý±Ø³ö¿É²»ÅäÖà goodGridNumList += notifyGridNumList GameWorld.DebugLog("goodGridNumList=%s" % goodGridNumList, playerID) # µ¥³é²ú³öÓÅÏȼ¶£º ÐÒÔËÎïÆ· > ±Ø³ö > ±£µ× > ÆÕͨ # Á¬³éûÓÐÓÅÏȼ¶ÏÞÖÆ£¬Ö»ÒªÂú×ãÌõ¼þ¼´¿É²ú³ö getGridResult = [] # 1.ÂúÐÒÔ˱سö if updLuck >= maxLuck: getGridResult.append(ipyData.GetLuckyGridNum()) GameWorld.DebugLog("ÂúÐÒÔ˱سöÐÒÔËÎïÆ·: gridNum=%s" % ipyData.GetLuckyGridNum(), playerID) # µ¥³é if treasureCount == 1: if not getGridResult: if updTreasureCount in beSureCountDict: gridNumRateList = beSureCountDict[updTreasureCount] gridNum = GameWorld.GetResultByRandomList(gridNumRateList) GameWorld.DebugLog("µ½´ï´ÎÊý±Ø³ö,updTreasureCount=%s,gridNumRateList=%s,gridNum=%s" % (updTreasureCount, gridNumRateList, gridNum), playerID) elif updTreasureCount % ensureCount == 0 and ensureRateList: gridNumRateList = ensureRateList gridNum = GameWorld.GetResultByRandomList(gridNumRateList) GameWorld.DebugLog("Âú´ÎÊý±£µ×³ö,updTreasureCount=%s,gridNumRateList=%s,gridNum=%s" % (updTreasureCount, gridNumRateList, gridNum), playerID) else: gridNumRateList = commItemRateList gridNum = GameWorld.GetResultByRandomList(gridNumRateList) GameWorld.DebugLog("³£¹æ²ú³ö,updTreasureCount=%s,gridNum=%s" % (updTreasureCount, gridNum), playerID) getGridResult.append(gridNum) # Á¬³é elif treasureCount > 1: # 2. ´ÎÊý±Ø³ö besureGridNumList = [] for count, gridNumRateList in beSureCountDict.items(): if curTreasureCount < count and updTreasureCount >= count: for gridInfo in gridNumRateList: besureGridNumList.append(gridInfo[1]) gridNum = GameWorld.GetResultByRandomList(gridNumRateList) getGridResult.append(gridNum) GameWorld.DebugLog("µ½´ï´ÎÊý±Ø³ö,count=%s,updTreasureCount=%s,gridNumRateList=%s,gridNum=%s" % (count, updTreasureCount, gridNumRateList, gridNum), playerID) # 3. ´ÎÊý±£µ× ensureGridNumList = [] if updTreasureCount / ensureCount > curTreasureCount / ensureCount and ensureRateList: for gridInfo in ensureRateList: ensureGridNumList.append(gridInfo[1]) gridNum = GameWorld.GetResultByRandomList(ensureRateList) getGridResult.append(gridNum) GameWorld.DebugLog("Âú´ÎÊý±£µ×³ö,updTreasureCount=%s,gridNumRateList=%s,gridNum=%s" % (updTreasureCount, ensureRateList, gridNum), playerID) # 4. ³£¹æ²ú³ö doCount = 200 needCount = max(0, treasureCount - len(getGridResult)) while needCount and doCount: doCount -= 1 gridNum = GameWorld.GetResultByRandomList(commItemRateList) if gridNum == ipyData.GetLuckyGridNum() and gridNum in getGridResult: GameWorld.DebugLog("ÐÒÔËÎïÆ·ÒѾ­³ö¹ý£¬²»ÔÙÖØ¸´²ú³ö£¡") continue if gridNum in besureGridNumList: canGive = True for besureGridNum in besureGridNumList: if besureGridNum in getGridResult: canGive = False GameWorld.DebugLog("´ÎÊý±Ø³öÎïÆ·ÒѾ­³ö¹ý£¬²»ÔÙÖØ¸´²ú³ö£¡gridNum=%s,besureGridNum=%s,besureGridNumList=%s" % (gridNum, besureGridNum, besureGridNumList), playerID) break if not canGive: continue if gridNum in ensureGridNumList: canGive = True for ensureGridNum in ensureGridNumList: if ensureGridNum in getGridResult: canGive = False GameWorld.DebugLog("Âú´ÎÊý±£µ×ÎïÆ·ÒѾ­³ö¹ý£¬²»ÔÙÖØ¸´²ú³ö£¡gridNum=%s,ensureGridNum=%s,ensureGridNumList=%s" % (gridNum, ensureGridNum, ensureGridNumList), playerID) break if not canGive: continue needCount -= 1 getGridResult.append(gridNum) GameWorld.DebugLog("³£¹æ²ú³ö: gridNum=%s" % (gridNum), playerID) else: return GameWorld.DebugLog("Ѱ±¦¸ñ×Ó½á¹û: getGridResult=%s" % getGridResult, playerID) if len(getGridResult) != treasureCount: GameWorld.ErrLog("Ѱ±¦Òì³££¬Êµ¼Ê»ñµÃÊýÁ¿ÓëѰ±¦ÇëÇóÊý²»Í¬£¡treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) return isBind = 0 # ÔÝʱĬÈϲ»°ó¶¨ job = curPlayer.GetJob() gridItemInfoDict = ipyData.GetGridItemInfo() # ¸ñ×Ó¶ÔÓ¦ÎïÆ·ÐÅÏ¢ {"¸ñ×Ó±àºÅ":[ÎïÆ·ID, ÊýÁ¿], ...} gridLibInfoDict = ipyData.GetGridLibInfo() # ¸ñ×Ó¶ÔÓ¦ÎïÆ·ÐÅÏ¢ {"¸ñ×Ó±àºÅ":[ÎïÆ·ID, ÊýÁ¿], ...} jobItemList = ipyData.GetJobItemList() treasureResult = [] randItemIDDict = IpyGameDataPY.GetFuncEvalCfg("TreasureSet", 2) for gridNum in getGridResult: gridNum = str(gridNum) if gridNum in gridItemInfoDict: itemID, itemCount = gridItemInfoDict[gridNum] itemID = GetJobItem(job, itemID, jobItemList) if not itemID: GameWorld.ErrLog("Ѱ±¦¸ñ×ÓÎïÆ·IDÒì³£!treasureType=%s,gridNum=%s" % (treasureType, gridNum), playerID) return # Ëæ»ú²ú³öÎïÆ· if itemID in randItemIDDict: canRandItemList = [] randItemIDList = randItemIDDict[itemID] for randItemID in randItemIDList: itemData = GameWorld.GetGameData().GetItemByTypeID(randItemID) if itemData.GetType() == ChConfig.Def_ItemType_Rune and not PlayerRune.GetIsOpenByRuneID(curPlayer, randItemID): GameWorld.DebugLog("δ½âËøµÄ·ûÓ¡²»²ú³ö£¡itemID=%s,randItemID=%s" % (itemID, randItemID), playerID) continue canRandItemList.append(randItemID) if not canRandItemList: GameWorld.ErrLog("Ѱ±¦Ëæ»ú¸ñ×ÓûÓпÉËæ»úµÄÎïÆ·!treasureType=%s,treasureIndex=%s,gridNum=%s,itemID=%s" % (treasureType, treasureIndex, gridNum, itemID), playerID) return itemID = random.choice(canRandItemList) # ¸ù¾ÝÎïÆ·¿âÀ´Ëæ»ú elif gridNum in gridLibInfoDict: libID = gridLibInfoDict[gridNum] libItemList = IpyGameDataPY.GetIpyGameDataList("TreasureItemLib", libID) if not libItemList: return itemWeightList = [] for libItem in libItemList: itemWeight, itemID, itemCount = libItem.GetItemWeight(), libItem.GetItemID(), libItem.GetItemCount() itemData = GameWorld.GetGameData().GetItemByTypeID(itemID) if not itemData: continue itemWeightList.append([itemWeight, [itemID, itemCount]]) if not itemWeightList: GameWorld.ErrLog("Ѱ±¦Ëæ»ú¸ñ×ÓûÓпÉËæ»úµÄÎïÆ·!treasureType=%s,treasureIndex=%s,gridNum=%s,libID=%s" % (treasureType, treasureIndex, gridNum, libID), playerID) return itemID, itemCount = GameWorld.GetResultByWeightList(itemWeightList) else: GameWorld.ErrLog("Ѱ±¦¸ñ×Ó²»´æÔÚ!treasureType=%s,gridNum=%s" % (treasureType, gridNum), playerID) return treasureResult.append([gridNum, itemID, itemCount, isBind]) # ¿ÛÏûºÄ if costType == 1: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeTime % (treasureType, treasureIndex), curTime) GameWorld.DebugLog("ÏûºÄÃâ·Ñ´ÎÊý£¬¸üÐÂÃâ·ÑCD¼ÆËãʱ¼ä: %s" % curTime, playerID) elif costType == 2: ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCostItemCount, ChConfig.ItemDel_Treasure) GameWorld.DebugLog("¿Û³ýѰ±¦µÀ¾ß,costItemID=%s,delCostItemCount=%s" % (costItemID, delCostItemCount), playerID) if lackCountCostMoney: infoDict = {"TreasureType":treasureType, "TreasureIndex":treasureIndex, "CostItemID":costItemID, "LackCount":lackCount} PlayerControl.PayMoney(curPlayer, moneyType, lackCountCostMoney, ChConfig.Def_Cost_Treasure, infoDict, lackCount) else: infoDict = {"TreasureType":treasureType, "TreasureIndex":treasureIndex} PlayerControl.PayMoney(curPlayer, costGoldType, costGold, ChConfig.Def_Cost_Treasure, infoDict) GameWorld.DebugLog("¿Û³ý»õ±Ò,costGoldType=%s,costGold=%s" % (costGoldType, costGold), playerID) # ¼ÓÊý¾Ý PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType, isFreeType), updTreasureCount) if ipyData.GetLuckyGridNum() in getGridResult: updLuck = 0 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureLuck % (treasureType), updLuck) PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_TreasureScore, addScore) if treasureType == TreasureType_Rune: PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RuneTreasure, treasureCount) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_RuneTreasure, treasureCount) PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_RuneTreasure, treasureCount) elif treasureType == TreasureType_Jipin: PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Treasure, treasureCount) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_Treasure, treasureCount) PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_Treasure, treasureCount) elif treasureType == TreasureType_Jueshi: PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_JSTreasure, treasureCount) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_JSTreasure, treasureCount) PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_JSTreasure, treasureCount) elif treasureType == TreasureType_GatherTheSoul: pass # ¸øÎïÆ· mailItemList = [] itemControl = ItemControler.PlayerItemControler(curPlayer) for gridNum, itemID, itemCount, isBind in treasureResult: itemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, False, curPlayer=curPlayer) mailItemDict = ItemCommon.GetMailItemDict(itemObj) if int(gridNum) in goodGridNumList: PlayerControl.WorldNotify(0, "HappyXB", [curPlayer.GetPlayerName(), itemID, itemObj.GetUserData(), itemCount]) if mailItemList or not itemControl.PutInItem(packType, itemObj, event=[ChConfig.ItemGive_Treasure, False, {}]): mailItemList.append(mailItemDict) itemObj.Clear() if mailItemList: PlayerControl.SendMailByKey("HappyXBUnEnough", [playerID], mailItemList) GameWorld.DebugLog("Ѱ±¦³É¹¦: treasureType=%s,updTreasureCount=%s,updLuck=%s,addLuck=%s,addScore=%s" % (treasureType, updTreasureCount, updLuck, addLuck, addScore), playerID) GameWorld.DebugLog(" treasureResult=%s" % (treasureResult), playerID) GameWorld.DebugLog(" mailItemList=%s" % (mailItemList), playerID) # ֪ͨǰ¶Ë sendPack = ChPyNetSendPack.tagMCTreasureResult() sendPack.Clear() sendPack.AddTreasureScore = addScore sendPack.AddTreasureLuck = addLuck sendPack.TreasureResult = str(treasureResult) sendPack.TreasureResultLen = len(sendPack.TreasureResult) NetPackCommon.SendFakePack(curPlayer, sendPack) Sync_TreasureInfo(curPlayer, treasureType) return def GetUpdLuckyItemRateList(ipyData, curLuck, luckFormula, costType): # »ñÈ¡ÐÒÔËÎïÆ·ÌáÉý¸ÅÂʺóµÄ±ýͼ srcPieList = ipyData.GetGridItemRateListFree() if costType == 1 else ipyData.GetGridItemRateList1() luckyGridNum = ipyData.GetLuckyGridNum() updRateList = [] for i, rateInfo in enumerate(srcPieList): rate, gridNum = rateInfo baseRate = rate if i == 0 else (rate - srcPieList[i - 1][0]) # Ô­¸ÅÂÊ if gridNum == luckyGridNum: newRate = eval(FormulaControl.GetCompileFormula("TreasureLuckyRate", luckFormula)) else: newRate = baseRate specRate = newRate if not updRateList else (updRateList[-1][0] + newRate) # ÌáÉýºó¶ÔÓ¦±ýͼ¸ÅÂÊ updRateList.append((specRate, gridNum)) return updRateList def GetJobItem(job, itemID, jobItemList): ## »ñÈ¡±¦ÏäÎïÆ·½±Àø¶ÔÓ¦µÄÖ°ÒµÎïÆ·£¬ Ö°Òµ´Ó1¿ªÊ¼ for jobItemIDList in jobItemList: if type(jobItemIDList) not in [list, tuple]: GameWorld.ErrLog("Ö°ÒµÎïÆ·×é¸ñʽ´íÎó!jobItemList=%s" % (jobItemList)) return 0 if itemID in jobItemIDList: if job <= 0 or job > len(jobItemIDList): GameWorld.ErrLog("Ö°ÒµÎïÆ·ÅäÖôíÎó,ûÓиÃÖ°Òµ¶ÔÓ¦ÎïÆ·ID!job=%s,itemID=%s" % (job, itemID)) return 0 return jobItemIDList[job - 1] return itemID def GetTreasureTypeList(): ## Ѱ±¦ÀàÐÍÁбí TreasureTypeList = IpyGameDataPY.GetConfigEx("TreasureType") if not TreasureTypeList: TreasureTypeList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for i in xrange(ipyDataMgr.GetTreasureHouseCount()): ipyData = ipyDataMgr.GetTreasureHouseByIndex(i) treasureType = ipyData.GetTreasureType() if treasureType not in TreasureTypeList: TreasureTypeList.append(treasureType) IpyGameDataPY.SetConfigEx("TreasureType", TreasureTypeList) return TreasureTypeList def Sync_TreasureInfo(curPlayer, treasureType=None): if treasureType == None: syncTypeList = GetTreasureTypeList() else: syncTypeList = [treasureType] treasureInfoPack = ChPyNetSendPack.tagMCTreasureInfo() treasureInfoPack.Clear() treasureInfoPack.TreasuerInfoList = [] for tType in syncTypeList: treasureCountList = IpyGameDataPY.GetFuncEvalCfg("TreasureSet1%s" % tType, 1) tTypeInfo = ChPyNetSendPack.tagMCTreasureTypeInfo() tTypeInfo.Clear() tTypeInfo.TreasureType = tType tTypeInfo.LuckValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (tType)) tTypeInfo.FreeCountTime = [] for i in xrange(len(treasureCountList)): tTypeInfo.FreeCountTime.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeTime % (tType, i))) tTypeInfo.IndexCount = len(tTypeInfo.FreeCountTime) treasureInfoPack.TreasuerInfoList.append(tTypeInfo) treasureInfoPack.InfoCount = len(treasureInfoPack.TreasuerInfoList) NetPackCommon.SendFakePack(curPlayer, treasureInfoPack) return