| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerFairyCeremony  | 
| #  | 
| # @todo:ÏɽçÊ¢µä  | 
| # @author xdh  | 
| # @date 2018-07-23 16:50  | 
| # @version 1.0  | 
| #  | 
| #  | 
| # ÏêϸÃèÊö: ÏɽçÊ¢µä  | 
| #  | 
| #---------------------------------------------------------------------  | 
| """Version = 2018-07-23 16:50"""  | 
| #---------------------------------------------------------------------  | 
| import IPY_GameWorld  | 
| import GameWorld  | 
| import ChConfig  | 
| import IpyGameDataPY  | 
| import PlayerControl  | 
| import ItemControler  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import ShareDefine  | 
| import PyGameData  | 
| import ItemCommon  | 
| import PlayerBillboard  | 
|   | 
| (  | 
| Def_FC_Recharge, #³äÖµ´óÀñ  | 
| Def_FC_Fireworks, #ÑÌ»¨  | 
| Def_FC_Party, #È«ÃñÀ´àË  | 
| Def_FC_RechargeRank, #¾ø°æ½µÁÙ  | 
| ) = range(1, 5)  | 
|   | 
|   | 
| def OnLogin(curPlayer):  | 
|     isReset = __CheckPlayerFairyCeremonyAction(curPlayer)  | 
|     if not isReset:  | 
|         actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FairyCeremony, {})  | 
|         # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢  | 
|         if actCostRebateInfo.get(ShareDefine.ActKey_State):  | 
|             SyncFCRechargeInfo(curPlayer)  | 
|             SyncFCPartyInfo(curPlayer)  | 
|     return  | 
|   | 
| def RefreshOperationAction_FairyCeremony():  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     for i in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(i)  | 
|         if curPlayer == None or not curPlayer.GetInitOK():  | 
|             continue  | 
|         __CheckPlayerFairyCeremonyAction(curPlayer)  | 
|     return  | 
|   | 
|   | 
| def __CheckPlayerFairyCeremonyAction(curPlayer):  | 
|     ## ¼ì²éÍæ¼ÒÏɽçÊ¢µä»î¶¯Êý¾ÝÐÅÏ¢  | 
|     playerID = curPlayer.GetPlayerID()  | 
|       | 
|     actFairyCeremonyInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FairyCeremony, {})  | 
|     FairyCeremonyID = actFairyCeremonyInfo.get(ShareDefine.ActKey_ID, 0)  | 
|     state = actFairyCeremonyInfo.get(ShareDefine.ActKey_State, 0)  | 
|       | 
|     playerFairyCeremonyID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyCeremonyID) # Íæ¼ÒÉíÉϵĻID  | 
|       | 
|     # »î¶¯ID ÏàͬµÄ»°²»´¦Àí  | 
|     if FairyCeremonyID == playerFairyCeremonyID:  | 
|         #GameWorld.DebugLog("ÏɽçÊ¢µä»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID())  | 
|         return  | 
|     ctgRMBTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TodayCTGCoinTotal) / 100  | 
|     actWorldLV = actFairyCeremonyInfo.get(ShareDefine.ActKey_WorldLV, 0)  | 
|     playerFCWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCActionWorldLV)  | 
|     GameWorld.DebugLog("ÏɽçÊ¢µäÖØÖÃ! FairyCeremonyID=%s,playerCostRebateID=%s,state=%s,ActWorldLV=%s,playerFCWorldLV=%s,ctgRMBTotal=%s"   | 
|                        % (FairyCeremonyID, playerFairyCeremonyID, state, actWorldLV, playerFCWorldLV, ctgRMBTotal), playerID)  | 
|       | 
|     # Î´ÁìÈ¡µÄ½±ÀøÓʼþ·¢·Å  | 
|     __SendFairyCeremonyMail(curPlayer, playerFCWorldLV)  | 
|       | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyCeremonyID, FairyCeremonyID)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCActionWorldLV, actWorldLV)  | 
|     #ÖØÖóäÖµ´óÀñ¼Ç¼  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCRechargeState, 0)  | 
|     #ÖØÖÃÈ«ÃñÀ´àË  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCPartyCurPoint, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCPartyAwardRecord, 0)  | 
|     for actid in ChConfig.PeoplePartyActIDList:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCPartyCurCnt % actid, 0)  | 
|     SyncFCPartyInfo(curPlayer)  | 
|     #ÖØÖÃÒѳäÖµRMB¼°ÑÌ»¨Ïà¹Ø  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCCTGRMBTotal, ctgRMBTotal)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCFireworksBuyCount, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCFireworksScore, 0)  | 
|     SyncFCRechargeInfo(curPlayer)  | 
|     return True  | 
|   | 
| def __SendFairyCeremonyMail(curPlayer, playerFCWorldLV):  | 
|     # Î´ÁìÈ¡µÄ½±ÀøÓʼþ·¢·Å  | 
|     #³äÖµ´óÀñ  | 
|     playerID = curPlayer.GetID()  | 
|     playerName = curPlayer.GetName()  | 
|     if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCRechargeState) == 1:  | 
|         worldLvNum = __GetFCWorldLVIndex(curPlayer, Def_FC_Recharge)  | 
|         awardInfoDict = IpyGameDataPY.GetFuncEvalCfg('CeremonyRecharge', 1, {})  | 
|         if str(worldLvNum) not in awardInfoDict:  | 
|             GameWorld.ErrLog('    Óʼþ·¢·Å³äÖµ´óÀñ½±Àø CeremonyRecharge Î´ÅäÖý±Àø worldLvNum=%s' % worldLvNum)  | 
|         else:  | 
|             awardList = awardInfoDict[str(worldLvNum)]  | 
|             PlayerControl.SendMailByKey('CeremonyPayPack', [playerID], awardList, [playerName])  | 
|     #È«ÃñÀ´àË  | 
|     worldLvNum = __GetFCWorldLVIndex(curPlayer, Def_FC_Party)  | 
|     curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCPartyCurPoint)  | 
|     awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCPartyAwardRecord)  | 
|     ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('AllPeoplePartyAward', {'WorldLvNum':worldLvNum}, True)  | 
|     if not ipyDataList:  | 
|         GameWorld.ErrLog('    Óʼþ·¢·ÅÈ«ÃñÀ´à˽±Àø AllPeoplePartyAward Î´ÅäÖÃÊÀ½çµÈ¼¶µµ WorldLvNum=%s' % worldLvNum)  | 
|         return  | 
|       | 
|     partyAwardList = []  | 
|     for ipyData in ipyDataList:  | 
|         index = ipyData.GetIndex()  | 
|         if awardRecord & pow(2, index):  | 
|             continue  | 
|         needPoint = ipyData.GetNeedPoint()  | 
|         if curPoint < needPoint:  | 
|             continue  | 
|         awardInfoDict = ipyData.GetAward()  | 
|         job = curPlayer.GetJob()  | 
|         if str(job) not in awardInfoDict:  | 
|             GameWorld.ErrLog('    Óʼþ·¢·ÅÈ«ÃñÀ´à˽±Àø AllPeoplePartyAward Î´ÅäÖÃÖ°Òµ½±Àø job=%s' % job)  | 
|             continue  | 
|         awardList = awardInfoDict[str(job)]  | 
|         partyAwardList += awardList  | 
|     if partyAwardList:  | 
|         PlayerControl.SendMailByKey('CeremonyHaiPoint', [playerID], partyAwardList, [playerName])  | 
|     return  | 
|   | 
| def __IsAtFCAction():  | 
|     ##ÊÇ·ñÔÚÏɽçÊ¢µä»î¶¯ÖÐ  | 
|     actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FairyCeremony, {})  | 
|     state = actBossRebornInfo.get(ShareDefine.ActKey_State, 0)  | 
|     return state == 1  | 
|   | 
| def __GetFCWorldLVIndex(curPlayer, fcType):  | 
|     #»ñÈ¡»î¶¯ÊÀ½çµÈ¼¶µµ  | 
|     playerFCWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCActionWorldLV)  | 
|     fcWorldlvDict = IpyGameDataPY.GetFuncEvalCfg('CeremonyWorldLv', 1, {})  | 
|     if str(fcType) not in fcWorldlvDict:  | 
|         return 0  | 
|     worldLVIndex = 0  | 
|     worldlvList = fcWorldlvDict[str(fcType)]  | 
|     for index, lvinfo in enumerate(worldlvList):  | 
|         minlv, maxlv = lvinfo  | 
|         if minlv <= playerFCWorldLV <= maxlv:  | 
|             worldLVIndex = index  | 
|             break  | 
|     return worldLVIndex  | 
|   | 
| #################³äÖµ´óÀñ##############################  | 
| def OnFCRecharge(curPlayer):  | 
|     if not __IsAtFCAction():  | 
|         return  | 
|     curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCRechargeState)  | 
|     if curState != 0:  | 
|         return  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCRechargeState, 1)  | 
|     SyncFCRechargeInfo(curPlayer)  | 
|     return  | 
|   | 
| def GetFCRechargeAward(curPlayer):  | 
|     ## ÁìÈ¡³äÖµ´óÀñ½±Àø  | 
|     curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCRechargeState)  | 
|     if curState != 1:  | 
|         return  | 
|     worldLvNum = __GetFCWorldLVIndex(curPlayer, Def_FC_Recharge)  | 
|     awardInfoDict = IpyGameDataPY.GetFuncEvalCfg('CeremonyRecharge', 1, {})  | 
|     if str(worldLvNum) not in awardInfoDict:  | 
|         GameWorld.ErrLog('    ÁìÈ¡³äÖµ´óÀñ½±Àø CeremonyRecharge Î´ÅäÖý±Àø worldLvNum=%s' % worldLvNum)  | 
|         return  | 
|     awardList = awardInfoDict[str(worldLvNum)]  | 
|     # ¼ì²é±³°ü  | 
|     needSpace = len(awardList)  | 
|     packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  | 
|     if needSpace > packSpace:  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")  | 
|         return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCRechargeState, 2)  | 
|     for itemID, itemCnt, isBind in awardList:  | 
|         ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem])  | 
|       | 
|     SyncFCRechargeInfo(curPlayer)  | 
|       | 
|     PlayerControl.WorldNotify(0, 'CeremonyRecharge', [curPlayer.GetName()])  | 
|     return  | 
|   | 
|   | 
| def SyncFCRechargeInfo(curPlayer):  | 
|     ## Í¨Öª³äÖµ´óÀñ»î¶¯×´Ì¬  | 
|     packData = ChPyNetSendPack.tagMCXJSDRecharge()  | 
|     packData.State = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCRechargeState)  | 
|     packData.CTGTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCCTGRMBTotal)  | 
|     packData.FireworksBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCFireworksBuyCount)  | 
|     packData.FirewordsScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCFireworksScore)  | 
|     NetPackCommon.SendFakePack(curPlayer, packData)  | 
|     return  | 
|   | 
| #################È«ÃñÀ´àË##############################  | 
| def AddFCPartyActionCnt(curPlayer, actionID, addCnt=1):  | 
|     ##Ôö¼ÓÈ«ÃñÀ´àËÍê³É´ÎÊý  | 
|     if not __IsAtFCAction():  | 
|         return  | 
|     ipyData = IpyGameDataPY.GetIpyGameData('AllPeopleParty', actionID)  | 
|     if not ipyData:  | 
|         return  | 
|     maxCnt = ipyData.GetTotalTimes()  | 
|     curCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCPartyCurCnt % actionID)  | 
|     if curCnt >= maxCnt:  | 
|         return  | 
|     newCnt = min(maxCnt, curCnt + addCnt)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCPartyCurCnt % actionID, newCnt)  | 
|     singlePoint = ipyData.GetAddPoint()  | 
|     addPoint = (newCnt - curCnt) * singlePoint  | 
|     curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCPartyCurPoint)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCPartyCurPoint, curPoint + addPoint)  | 
|     PlayerControl.NotifyCode(curPlayer, "AddFCPartyPoint", [addPoint])  | 
|     SyncFCPartyInfo(curPlayer, [actionID])  | 
|     return  | 
|   | 
| def AddFCPartyPoint(curPlayer, addPoint):  | 
|     ## Ö±½ÓÔö¼Óà赋  | 
|     curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCPartyCurPoint)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCPartyCurPoint, curPoint + addPoint)  | 
|     PlayerControl.NotifyCode(curPlayer, "AddFCPartyPoint", [addPoint])  | 
|     SyncFCPartyInfo(curPlayer)  | 
|     return  | 
|   | 
| def GetFCPartyAward(curPlayer, index):  | 
|     ## È«ÃñÀ´àËÁì½±  | 
|     worldLvNum = __GetFCWorldLVIndex(curPlayer, Def_FC_Party)  | 
|       | 
|     ipyData = IpyGameDataPY.GetIpyGameData('AllPeoplePartyAward', worldLvNum, index)  | 
|     if not ipyData:  | 
|         return  | 
|       | 
|     curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCPartyCurPoint)  | 
|     if curPoint < ipyData.GetNeedPoint():  | 
|         GameWorld.DebugLog('    È«ÃñÀ´àËÁì½±, µãÊý²»×ã%s,  worldLvNum=%s, index=%s' % (ipyData.GetNeedPoint(), worldLvNum, index), curPlayer.GetID())  | 
|         return  | 
|     awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCPartyAwardRecord)  | 
|     awardMark = pow(2, index)  | 
|     if awardRecord & awardMark:  | 
|         GameWorld.DebugLog('    È«ÃñÀ´àËÁì½±, ÒÑÁì½±,  worldLvNum=%s, index=%s' % (worldLvNum, index), curPlayer.GetID())  | 
|         return  | 
|     awardInfoDict = ipyData.GetAward()  | 
|     job = curPlayer.GetJob()  | 
|     if str(job) not in awardInfoDict:  | 
|         return  | 
|     awardList = awardInfoDict[str(job)]  | 
|     # ¼ì²é±³°ü  | 
|     needSpace = len(awardList)  | 
|     packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  | 
|     if needSpace > packSpace:  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")  | 
|         return  | 
|     #¸üмǼ  | 
|     awardRecord |= awardMark  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCPartyAwardRecord, awardRecord)  | 
|     for itemID, itemCnt, isBind in awardList:  | 
|         ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem])  | 
|     #֪ͨ  | 
|     SyncFCPartyInfo(curPlayer, isGetAward=True)  | 
|     return  | 
|   | 
|   | 
| def SyncFCPartyInfo(curPlayer, actIDList=[], isGetAward=False):  | 
|     ##֪ͨȫÃñÀ´àËÐÅÏ¢  | 
|     packData = ChPyNetSendPack.tagMCAllPeoplePartyInfo()  | 
|     packData.Clear()  | 
|     packData.CurPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCPartyCurPoint)  | 
|     packData.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCPartyAwardRecord)  | 
|     if not isGetAward:  | 
|         packData.BuyCountList = []  | 
|         for actID in ChConfig.PeoplePartyActIDList:  | 
|             if actIDList and actID not in actIDList:  | 
|                 continue  | 
|             finishInfo = ChPyNetSendPack.tagMCAllPeoplePartyCount()  | 
|             finishInfo.ActID = actID  | 
|             finishInfo.CurTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCPartyCurCnt % actID)  | 
|             packData.BuyCountList.append(finishInfo)  | 
|         packData.Count = len(packData.BuyCountList)  | 
|       | 
|     NetPackCommon.SendFakePack(curPlayer, packData)  | 
|     return  | 
|   | 
| #################¾ø°æ½µÁÙ##############################  | 
|   | 
| def AddFCCTGRMB(curPlayer, ctgRMB):  | 
|     ## ³äÖµXÔª  | 
|     if ctgRMB <= 0:  | 
|         return  | 
|     if not __IsAtFCAction():  | 
|         return  | 
|     curRMBTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCCTGRMBTotal)  | 
|     updRMBTotal = curRMBTotal + ctgRMB  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCCTGRMBTotal, updRMBTotal)  | 
|     GameWorld.Log("¸üÐÂÏɽçÊ¢µä³äÖµRMBÖµ: curRMBTotal=%s,ctgRMB=%s,updRMBTotal=%s"   | 
|                   % (curRMBTotal, ctgRMB, updRMBTotal), curPlayer.GetPlayerID())  | 
|     SyncFCRechargeInfo(curPlayer)  | 
|     return  | 
|   | 
| def OnBuyFireworks(curPlayer, itemIndex, clientBuyCount):  | 
|     ## ¹ºÂòÑÌ»¨  | 
|     if not __IsAtFCAction():  | 
|         return  | 
|       | 
|     fireworksDict = IpyGameDataPY.GetFuncEvalCfg('CeremonyFireParty', 1, {})  | 
|     worldLvNum = __GetFCWorldLVIndex(curPlayer, Def_FC_Fireworks)  | 
|     canBuyIDList = fireworksDict.get(str(worldLvNum), []) #[ÆÕͨÑÌ»¨, ¸ß¼¶ÑÌ»¨]  | 
|     if itemIndex not in canBuyIDList:  | 
|         return  | 
|     fireworksIndex = canBuyIDList.index(itemIndex)  | 
|     AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Fireworks, clientBuyCount)  | 
|     if fireworksIndex == 1:  | 
|         fireworksBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCFireworksBuyCount) + clientBuyCount  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCFireworksBuyCount, fireworksBuyCount)  | 
|         GameWorld.DebugLog("¸üÐÂÍæ¼Ò¸ß¼¶ÑÌ»¨ÒѹºÂò´ÎÊý: clientBuyCount=%s,fireworksBuyCount=%s"   | 
|                            % (clientBuyCount, fireworksBuyCount), curPlayer.GetPlayerID())  | 
|           | 
|     fireworksScoreList = IpyGameDataPY.GetFuncEvalCfg('CeremonyFireParty', 2) # [ÆÕͨÑÌ»¨»ý·Ö, ¸ß¼¶ÑÌ»¨»ý·Ö]  | 
|     addScore = fireworksScoreList[fireworksIndex] * clientBuyCount  | 
|     curFireworksScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCFireworksScore)  | 
|     updFireworksScore = curFireworksScore + addScore  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FCFireworksScore, updFireworksScore)  | 
|       | 
|     billboardNeedScore = IpyGameDataPY.GetFuncCfg('CeremonyFireParty', 4)  | 
|     if updFireworksScore >= billboardNeedScore:  | 
|         #¸üÐÂÅÅÐаñ  | 
|         GameWorld.DebugLog("Íæ¼Ò¾ø°æ½µÁÙ»ý·ÖÅÅÐиüÐÂ: itemIndex=%s,clientBuyCount=%s,curFireworksScore=%s,addScore=%s,updFireworksScore=%s"   | 
|                            % (itemIndex, clientBuyCount, curFireworksScore, addScore, updFireworksScore), curPlayer.GetPlayerID())  | 
|         PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_FCCostGold, updFireworksScore)  | 
|     else:  | 
|         GameWorld.DebugLog("Íæ¼Ò¾ø°æ½µÁÙÑÌ»¨»ý·Ö²»×㣬ÎÞ·¨Éϰñ! updFireworksScore=%s < billboardNeedScore=%s"   | 
|                            % (updFireworksScore, billboardNeedScore), curPlayer.GetPlayerID())  | 
|           | 
|     SyncFCRechargeInfo(curPlayer)   | 
|     return  | 
|   | 
| #################ÑÌ»¨¿ñ»¶##############################  | 
| def IsCanBuyFireworks(curPlayer, itemIndex, clientBuyCount):  | 
|     ##µ±Ç°ÊÇ·ñ¿ÉÒÔÂòÑÌ»¨  | 
|     if not __IsAtFCAction():  | 
|         GameWorld.Log('    ÑÌ»¨¿ñ»¶ÂòÑÌ»¨ »î¶¯Î´¿ªÆô, ÎÞ·¨¹ºÂò')  | 
|         return False  | 
|     fireworksDict = IpyGameDataPY.GetFuncEvalCfg('CeremonyFireParty', 1, {})  | 
|     worldLvNum = __GetFCWorldLVIndex(curPlayer, Def_FC_Fireworks)  | 
|     canBuyIDList = fireworksDict.get(str(worldLvNum), []) #[ÆÕͨÑÌ»¨, ¸ß¼¶ÑÌ»¨]  | 
|     if itemIndex not in canBuyIDList:  | 
|         GameWorld.Log('    ÑÌ»¨¿ñ»¶ÂòÑÌ»¨ µ±Ç°¿ÉÒÔÂòÑÌ»¨Îª %s, ÎÞ·¨¹ºÂò %s,worldLvNum=%s'%(canBuyIDList, itemIndex,worldLvNum), curPlayer.GetID())  | 
|         return False  | 
|     #¸ß¼¶ÑÌ»¨ÐèÒªÅжϳäÖµµÄ×Ü¶î  | 
|     buyOneNeedRMB = IpyGameDataPY.GetFuncCfg('CeremonyFireParty', 3) # ¹ºÂòÒ»¸ö¸ß¼¶ÑÌ»¨ËùÐè³äÖµRMBÖµ£¬µ¥Î»XÔª  | 
|     if itemIndex == canBuyIDList[-1] and buyOneNeedRMB:  | 
|         curRMBTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCCTGRMBTotal)  | 
|         fireworksBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FCFireworksBuyCount)  | 
|         totalCanBuyCount = curRMBTotal / buyOneNeedRMB  | 
|         if (fireworksBuyCount + clientBuyCount) > totalCanBuyCount:  | 
|             GameWorld.Log('    ÑÌ»¨¿ñ»¶ÂòÑÌ»¨  ¸ß¼¶ÑÌ»¨ËùÐèÖØÖÃRMB²»×ã, ÎÞ·¨¹ºÂò! curRMBTotal=%s,totalCanBuyCount=%s < fireworksBuyCount=%s + clientBuyCount=%s'   | 
|                           % (curRMBTotal, totalCanBuyCount, fireworksBuyCount, clientBuyCount), curPlayer.GetID())  | 
|             return False  | 
|     return True  |