| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerCostVIP  | 
| #  | 
| # @todo:Ïû·ÑVIP  | 
| # @author ljd  | 
| # @date 2015-04-21 11:30  | 
| # @version 1.7  | 
| #  | 
| # @change: "2015-08-18 15:50" ljd ÌØÊâ´¦ÀíÊýÖµÅä´í,VIPµÈ¼¶¾Ñéµ÷С,ÌØÊâ´¦ÀíÍâÍøÒÑÉý¼¶VIPÍæ¼Ò,²¹»ØVIPµÈ¼¶  | 
| # @change: "2016-01-26 15:00" hxp PY±íÖ§³ÖÖØ¶Á  | 
| # @change: "2016-06-15 12:00" hxp ³èÎïÊØ»¤Î»½âËø  | 
| # @change: "2016-07-02 16:30" hxp VIPÌØÈ¨buff¸ÄΪ±»¶¯¼¼ÄܼÓÕ½¶·Á¦  | 
| # @change: "2016-10-17 16:00" hxp Ôö¼Ó¾Ñ鸱±¾¡¢½ð±Ò¸±±¾ÊÕÒæÌØÈ¨  | 
| # @change: "2017-04-01 10:30" xdh CostVIP.txtÈ¥³ýÖ°ÒµÇø±ð  | 
| # @change: "2017-05-24 16:08" xdh Ôö¼ÓVIP³É³¤½±Àø  | 
| #  | 
| # ÏêϸÃèÊö: Ïû·Ñ×êʯÊýÔö¼ÓVIPµÈ¼¶,¸ù¾ÝVIPµÈ¼¶Ôö¼ÓÌØÈ¨ºÍ¸øÓè½±Àø  | 
| #  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2017-05-24 16:08"""  | 
| #---------------------------------------------------------------------  | 
| import IPY_GameWorld  | 
| import GameWorld  | 
| import ChConfig  | 
| import ReadChConfig  | 
| import PyMapTable  | 
| import ItemControler  | 
| import PlayerControl  | 
| import DataRecordPack  | 
| import ShareDefine  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import ChPlayer  | 
| import SkillCommon  | 
| import BuffSkill  | 
| import EventShell  | 
|   | 
| import HighLadderTube  | 
| import Operate_PlayerBuyZhenQi  | 
|   | 
|   | 
| # Ïû·ÑVIPÐÅÏ¢±íÁбêʶ  | 
| CostVIPData_LV = "LV"               # VIPµÈ¼¶  | 
| CostVIPData_Exp = "EXP"             # Éý¼¶ËùÐè¾Ñé  | 
| # ----- Íâµ÷ÔÙ·â×°º¯ÊýʹÓà-----  | 
| CostVIPData_PrayNum = "PrayNum"         # Æíµ»´ÎÊý  | 
| CostVIPData_ArenaNum = "ArenaNum"       # ¾º¼¼³¡Ôö¼Ó´ÎÊý  | 
| CostVIPData_RoundReward = "RoundReward" # »·ÈÎÎñ½±Àø¼Ó³É <°Ù·ÖÂÊ>  | 
| CostVIPData_RoundStar = "RoundStar"     # »·ÈÎÎñ×ÖµäÐǼ¶  | 
| CostVIPData_BZZDExpAddRate = "BZZDExpAddRate"     # ¾ÑéÃØ¾³¾Ñé¼Ó³É  | 
| CostVIPData_RedPacketGrabCnt = "RedPacketGrabCnt"     # ÇÀºì°üÿÈÕ¿ÉÇÀ´ÎÊýÔö¼Ó  | 
| CostVIPData_KillWorldBossAddCnt = "KillWorldBossAddCnt"     # »÷ɱÊÀ½çboss´ÎÊýÔö¼Ó  | 
|   | 
| # Ïû·ÑVIPÐÅÏ¢±í½±ÀøÅäÖøñʽ  | 
| (  | 
| Reward_Item_Type,   # ÎïÆ·ÀàÐÍ  | 
| Reward_Item_Id,     # ÎïÆ·ID  | 
| Reward_Item_Num,    # ÎïÆ·ÊýÁ¿  | 
| Reward_Item_Bind,   # ÊÇ·ñ°ó¶¨  | 
| ) = range(4)  | 
|   | 
| # ÎïÆ·ÀàÐÍ  | 
| (  | 
| Item_Type_Common,   # Ò»°ãÎïÆ·±í  | 
| Item_Type_Appoint,  # ÌØÊâ¶¨ÖÆÎïÆ·  | 
| ) = range(2)  | 
|   | 
|   | 
| ## Ôö¼ÓÏû·ÑVIP¾Ñé  | 
| #  @param curPlayer  | 
| #  @param costType Ïû·ÑÀàÐÍ  | 
| #  @param costGold Ïû·Ñ×êʯÊý  | 
| #  @return  | 
| def AddCostVIPExp(curPlayer, costType, costGold):  | 
|     GameWorld.DebugLog("==[PlayerCostVIP]== In->AddCostVIPExp() player(%s)" % curPlayer.GetPlayerName())  | 
|       | 
|     if costGold <= 0:  | 
|         GameWorld.DebugLog("AddCostVIPExp() no cost(%s) gold" % costType)  | 
|         return  | 
|     if costType in ChConfig.CostVIP_CostType:  | 
|         GameWorld.DebugLog("AddCostVIPExp() no use cost(%s) type" % costType)  | 
|         return  | 
|       | 
|     moneyToExpScale = eval(ReadChConfig.GetEvalChConfig('CostVIPMoneyToExp'))  | 
|     addExp = int(costGold * moneyToExpScale)  | 
|     if addExp <= 0:  | 
|         GameWorld.DebugLog("AddCostVIPExp() no add EXP")  | 
|         return  | 
|     curExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostVIPExp)  | 
|     lastLV = curPlayer.GetVIPLv()  | 
|     __AddCostVIPExp(curPlayer, addExp)  | 
|       | 
|       | 
|     if lastLV != curPlayer.GetVIPLv():  | 
|         DataRecordPack.DR_PlayerCostVIPLV(curPlayer, lastLV, curExp, addExp, costType, costGold)  | 
|       | 
|     return  | 
|   | 
| ## Ôö¼ÓÏû·ÑVIP¾Ñé  | 
| def __AddCostVIPExp(curPlayer, addExp):  | 
|     curLV = curPlayer.GetVIPLv()  | 
|     needExp = __GetCostVIPData(curPlayer, curLV, CostVIPData_Exp)  | 
|     if not needExp:  | 
|         GameWorld.DebugLog("__AddCostVIPExp() EXP no configuration vipLV(%s)" % curLV)  | 
|         return  | 
|       | 
|     curExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostVIPExp)  | 
|     newExp = curExp + addExp  | 
|   | 
|     while needExp and newExp >= needExp:  | 
|         curLV += 1  | 
|         __SetVIPLV(curPlayer, curLV)  | 
|           | 
|         newExp -= needExp  | 
|         needExp = __GetCostVIPData(curPlayer, curLV, CostVIPData_Exp)  | 
|           | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostVIPExp, newExp if needExp else 0)  | 
|       | 
|     Sync_CostVIPInfo(curPlayer)  | 
|       | 
|     GameWorld.DebugLog("    __AddCostVIPExp() LV(%s) EXP(%s)" % (curLV, newExp))  | 
|     return  | 
|   | 
| ## Ïû·ÑVIPµÇ½  | 
| #  @param curPlayer  | 
| #  @param tick  | 
| #  @return  | 
| def CostVIPOnLogin(curPlayer, tick):  | 
|       | 
|     Sync_CostVIPInfo(curPlayer)  | 
|     Sync_CostVIPAwardState(curPlayer)  | 
|     Sync_CostVIPGrowUpAwardState(curPlayer)  | 
|     return  | 
|   | 
| ## ¹ºÂòÏû·ÑVIPÎïÆ·  | 
| #  @param index  | 
| #  @param clientPack <VIPLV-VIPµÈ¼¶>  | 
| #  @param tick  | 
| #  @return  | 
| def BuyCostVIPItem(index, clientPack, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     GameWorld.DebugLog("==[PlayerCostVIP]== In->BuyCostVIPItem(), Name:%s" % curPlayer.GetPlayerName())  | 
|       | 
|     getVIPLV = clientPack.VIPLV  | 
|       | 
|     if getVIPLV > curPlayer.GetVIPLv():  | 
|         GameWorld.DebugLog("BuyCostVIPItem() VIP LV(%s) no buy LV(%s)" % (curPlayer.GetVIPLv(), getVIPLV))  | 
|         return  | 
|       | 
|     buyItemStateKey = ChConfig.Def_PDict_CostVIPBuyItem  | 
|     buyItemState = curPlayer.NomalDictGetProperty(buyItemStateKey)  | 
|     if buyItemState & pow(2, getVIPLV):  | 
|         GameWorld.DebugLog("BuyCostVIPItem() had buy reward(%s)" % getVIPLV)  | 
|         return  | 
|       | 
|     VIPBuyItemCfg = ReadChConfig.GetEvalChConfig('VIPBuyItemCfg')  | 
|     if getVIPLV not in VIPBuyItemCfg:  | 
|         GameWorld.DebugLog("VIPBuyItemCfg.txt Î´ÅäÖùºÂòÐÅÏ¢ vip=%s" % getVIPLV)  | 
|         return  | 
|     buyItemInfo = VIPBuyItemCfg[getVIPLV]  | 
|     if len(buyItemInfo) !=3:  | 
|         return  | 
|     itemPrice, needSpace, itemList = buyItemInfo  | 
|     packSpace = ItemControler.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem)  | 
|     if packSpace < needSpace:  | 
|         GameWorld.DebugLog("BuyCostVIPItem() no enough(%s) pack space(%s)" % (needSpace, packSpace))  | 
|         return  | 
|       | 
|     moneyType = IPY_GameWorld.TYPE_Price_Gold_Money  | 
|     if itemPrice > 0:  | 
|         if not PlayerControl.HaveMoney(curPlayer, moneyType, itemPrice, True):  | 
|             GameWorld.DebugLog("BuyCostVIPItem() no enough money(%s)" % itemPrice)  | 
|             return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, buyItemStateKey, buyItemState | pow(2, getVIPLV))  | 
|       | 
|     if itemPrice > 0:  | 
|         infoDict = {"getVIPLV":getVIPLV, ChConfig.Def_Cost_Reason_SonKey:"VIP%s"%getVIPLV}  | 
|         PlayerControl.PayMoney(curPlayer, moneyType, itemPrice, ChConfig.Def_Cost_BuyVIPItem, infoDict)  | 
|               | 
|     __GiveItem(curPlayer, itemList)  | 
|       | 
|     Sync_CostVIPInfo(curPlayer)  | 
|     GameWorld.DebugLog("==[PlayerCostVIP]== Out->BuyCostVIPItem()")  | 
|     return  | 
|   | 
| ## ÁìÈ¡Ïû·ÑVIP½±Àø  | 
| #  @param curPlayer  | 
| #  @param getVIPLV ÁìÈ¡µÄVIPµÈ¼¶  | 
| #  @return  | 
| def GetCostVIPAward(curPlayer, getVIPLV):  | 
|     if getVIPLV > curPlayer.GetVIPLv():  | 
|         GameWorld.DebugLog("GetCostVIPAward() VIP LV(%s) no buy LV(%s)" % (curPlayer.GetVIPLv(), getVIPLV))  | 
|         return  | 
|       | 
|     rewardStateKey = ChConfig.Def_PDict_CostVIPLVReward  | 
|     rewardState = curPlayer.NomalDictGetProperty(rewardStateKey)  | 
|     if rewardState & pow(2, getVIPLV):  | 
|         GameWorld.DebugLog("GetCostVIPAward() had got reward(%s)" % getVIPLV)  | 
|         return  | 
|       | 
|     VIPAwardCfg = ReadChConfig.GetEvalChConfig('VIPAwardCfg')  | 
|     if getVIPLV not in VIPAwardCfg:  | 
|         GameWorld.DebugLog("VIPAwardCfg.txt Î´ÅäÖý±ÀøÐÅÏ¢ vip=%s" % getVIPLV)  | 
|         return  | 
|     rewardList = VIPAwardCfg[getVIPLV]  | 
|       | 
|     packSpace = ItemControler.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem)  | 
|     if packSpace < rewardList[0]:  | 
|         GameWorld.DebugLog("GetCostVIPAward() no enough(%s) pack space(%s)" % (rewardList[0], packSpace))  | 
|         return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, rewardStateKey, rewardState | pow(2, getVIPLV))  | 
|       | 
|     __GiveItem(curPlayer, rewardList[1:])  | 
|       | 
|     Sync_CostVIPAwardState(curPlayer)  | 
|     return  | 
|   | 
| ## ÁìÈ¡VIP³É³¤½±Àø  | 
| def GetVIPGrowUpAward(curPlayer, index):  | 
|     growUpAwardDict = ReadChConfig.GetEvalChConfig('VIPGrowUpAward')  | 
|     if index not in growUpAwardDict:  | 
|         return  | 
|       | 
|     rewardStateKey = ChConfig.Def_PDict_CostVIPGrowUpReward  | 
|     rewardState = curPlayer.NomalDictGetProperty(rewardStateKey)  | 
|     if rewardState & pow(2, index):  | 
|         GameWorld.DebugLog("    ÁìÈ¡VIP³É³¤½±Àø had got reward(%s)" % index)  | 
|         return  | 
|       | 
|     needLV, vipExp, itemList = growUpAwardDict[index]  | 
|     if curPlayer.GetLV() < needLV:  | 
|         GameWorld.DebugLog('    ÁìÈ¡VIP³É³¤½±Àøindex=%s, Íæ¼ÒµÈ¼¶²»×ã%s'%(index, needLV))  | 
|         return  | 
|       | 
|     packSpace = ItemControler.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem)  | 
|       | 
|     if packSpace < len(itemList):  | 
|         GameWorld.DebugLog("ÁìÈ¡VIP³É³¤½±Àø no enough(%s) pack space(%s)" % (len(itemList), packSpace))  | 
|         return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, rewardStateKey, rewardState | pow(2, index))  | 
|       | 
|     __AddCostVIPExp(curPlayer, vipExp)  | 
|     PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_437683", [vipExp])  | 
|     __GiveItem(curPlayer, itemList)  | 
|       | 
|     Sync_CostVIPGrowUpAwardState(curPlayer)  | 
|     return  | 
|   | 
| ## Í¨Öª³É³¤½±ÀøÁìȡ״̬  | 
| #  @param curPlayer  | 
| #  @return  | 
| def Sync_CostVIPGrowUpAwardState(curPlayer):  | 
| #    awardType = ShareDefine.Def_RewardType_CostVIPGrowUp  | 
| #    awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostVIPGrowUpReward)  | 
| #    ChPlayer.Sync_RewardGetRecordInfo(curPlayer, awardType, awardState)  | 
|     return  | 
|   | 
| ## Í¨ÖªÏû·ÑVIPÐÅÏ¢  | 
| #  @param curPlayer  | 
| #  @return  | 
| def Sync_CostVIPInfo(curPlayer):  | 
|     sendPack = ChPyNetSendPack.tagMCVIPInfo()  | 
|     sendPack.Clear()  | 
|     sendPack.Exp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostVIPExp)  | 
|     sendPack.BuyState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostVIPBuyItem)  | 
|     NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|     return  | 
|   | 
| ## Í¨Öª½±ÀøÁìȡ״̬  | 
| #  @param curPlayer  | 
| #  @return  | 
| def Sync_CostVIPAwardState(curPlayer):  | 
|     #awardType = ShareDefine.Def_RewardType_CostVIPLV  | 
|     #awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostVIPLVReward)  | 
|     #ChPlayer.Sync_RewardGetRecordInfo(curPlayer, awardType, awardState)  | 
|     return  | 
|   | 
| ## Ïû·ÑVIPÉý¼¶VIP  | 
| #  @param curPlayer  | 
| #  @param vipLV Ïû·ÑVIPµÈ¼¶  | 
| #  @return  | 
| def __SetVIPLV(curPlayer, vipLV):  | 
|     curPlayer.SetVIPLv(vipLV)  | 
|     #vipµÈ¼¶¸Ä±ä´¥·¢ÈÎÎñ  | 
|     EventShell.EventResponse_OnVipLvUp(curPlayer)  | 
|     tick = GameWorld.GetGameWorld().GetTick()  | 
|     __AddBuff(curPlayer, tick)          | 
|     __NtfChangeInfo(curPlayer, tick)  | 
|     return  | 
|   | 
| ## ¸øÓèÎïÆ·  | 
| #  @param curPlayer  | 
| #  @param itemList ÎïÆ·ÁÐ±í  | 
| #  @return  | 
| def __GiveItem(curPlayer, itemList):  | 
|     giveFailList = []  | 
|     for itemInfo in itemList:  | 
|         itemType = itemInfo[Reward_Item_Type]  | 
|         itemId = itemInfo[Reward_Item_Id]  | 
|         itemNum = itemInfo[Reward_Item_Num]  | 
|         itemIsBind = itemInfo[Reward_Item_Bind]  | 
|         if isinstance(itemId, dict):  | 
|             if curPlayer.GetJob() not in itemId:  | 
|                 GameWorld.ErrLog(" PlayerCostVIP __GiveItem  itemId=%s, Ö°Òµ(%s)δÅäÖÃ"   | 
|                                  % (itemId, curPlayer.GetJob()))  | 
|                 continue  | 
|             itemId = itemId[curPlayer.GetJob()]  | 
|               | 
|         if itemNum <= 0 or itemId <= 0:  | 
|             continue  | 
|           | 
|         if itemType == Item_Type_Common:  | 
|             packIndexList = [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere]  | 
|             if not ItemControler.GivePlayerItem(curPlayer, itemId, itemNum, itemIsBind, packIndexList, True, showSysInfo=True):  | 
|                 giveFailList.append(itemInfo)  | 
|               | 
|         elif itemType == Item_Type_Appoint:  | 
|             if not ItemControler.GivePlayerAppointItem(curPlayer, itemId, itemIsBind, True, showSysInfo=True):  | 
|                 giveFailList.append(itemInfo)  | 
|                   | 
|     if giveFailList:  | 
|         GameWorld.ErrLog("__GiveItem() give fail item(%s)" % str(giveFailList), curPlayer.GetPlayerID())  | 
|     return  | 
|   | 
| ## ¼ÓBuff  | 
| #  @param curPlayer  | 
| #  @param tick  | 
| #  @return ÊÇ·ñ¼Ó³É¹¦  | 
| def __AddBuff(curPlayer, tick):  | 
|     costVIPBuffTypeID = ChConfig.Def_SkillID_CostVipBuff  | 
|     curVIPLv = curPlayer.GetVIPLv()  | 
|     curSkill = GameWorld.GetGameData().FindSkillByType(costVIPBuffTypeID, curVIPLv)  | 
|     if not curSkill:  | 
|         return  | 
|       | 
|     playerSkillManager = curPlayer.GetSkillManager()  | 
|     BuffSkill.DelBuffBySkillID(curPlayer, costVIPBuffTypeID, tick)  | 
|     playerSkillManager.DeleteSkillBySkillTypeID(costVIPBuffTypeID)  | 
|   | 
|     skillID = curSkill.GetSkillID()  | 
|     playerSkillManager.LVUPSkillByID(skillID)  | 
|     SkillCommon.AddBuffBySkillType(curPlayer, costVIPBuffTypeID, tick, curVIPLv)  | 
|     return True  | 
|   | 
| ## Í¨ÖªÐÅÏ¢±ä»¯  | 
| #  @param curPlayer  | 
| #  @param tick  | 
| #  @return None  | 
| def __NtfChangeInfo(curPlayer, tick):  | 
|     HighLadderTube.SendHighLadderState(curPlayer, tick)  | 
|     Operate_PlayerBuyZhenQi.Sync_NotifyDataChange(curPlayer)  | 
|     return  | 
|   | 
| ## »ñÈ¡Ïû·ÑVIPÅäÖÃÐÅÏ¢  | 
| #  @param curPlayer  | 
| #  @param vipLV VIPµÈ¼¶  | 
| #  @param dataKey ÏûÏ¢±íÁбí±êʶ  | 
| #  @return ·µ»Ø¶ÔÓ¦ÐÅÏ¢  | 
| def __GetCostVIPData(curPlayer, vipLV=-1, dataKey=''):  | 
|     if vipLV < 0:  | 
|         vipLV = curPlayer.GetVIPLv()  | 
|       | 
|     searchDict = {CostVIPData_LV:str(vipLV)}  | 
|     costVIPTable = PyMapTable.GetPyMapTable("CostVIP")  | 
|       | 
|     costVIPDataList = costVIPTable.GetRecordByDic(searchDict)  | 
|     if len(costVIPDataList) != 1:  | 
|         GameWorld.DebugLog("__GetCostVIPData() vipLV(%s) configuration repeat" % (vipLV))  | 
|         return  | 
|       | 
|     if dataKey == '':  | 
|         return costVIPDataList[0]  | 
|       | 
|     costVIPData = costVIPDataList[0].get(dataKey)  | 
|     if not costVIPData:  | 
|         GameWorld.DebugLog("__GetCostVIPData() %s no configuration vipLV(%s)" % (dataKey, vipLV))  | 
|         return  | 
|       | 
|     return eval(costVIPData)  | 
|   | 
|   | 
| # ----- Íâµ÷ÔÙ·â×°º¯Êý -----  | 
| ## »ñÈ¡Æíµ»´ÎÊýÁÐ±í  | 
| def GetPrayNumList(curPlayer, default=[]):  | 
|     prayNumList = __GetCostVIPData(curPlayer, dataKey = CostVIPData_PrayNum)  | 
|     if not prayNumList:  | 
|         return default  | 
|     return prayNumList  | 
| # »ñÈ¡¾º¼¼³¡Ôö¼Ó´ÎÊý  | 
| def GetArenaNum(curPlayer, default=0):  | 
|     arenaNum = __GetCostVIPData(curPlayer, dataKey = CostVIPData_ArenaNum)  | 
|     if not arenaNum:  | 
|         return default  | 
|     return arenaNum  | 
| # »ñÈ¡»·ÈÎÎñ½±Àø¼Ó³É<°Ù·ÖÂÊ>  | 
| def GetRoundReward(curPlayer, default=0):  | 
|     roundReward = __GetCostVIPData(curPlayer, dataKey = CostVIPData_RoundReward)  | 
|     if not roundReward:  | 
|         return default  | 
|     return roundReward  | 
| # »ñÈ¡»·ÈÎÎñ×ÖµäÐǼ¶  | 
| def GetRoundStar(curPlayer, default=0):  | 
|     roundStar = __GetCostVIPData(curPlayer, dataKey = CostVIPData_RoundStar)  | 
|     if not roundStar:  | 
|         return default  | 
|     return roundStar  | 
| # ¾ÑéÃØ¾³¾Ñé¼Ó³É  | 
| def GetBZZDExpAddRate(curPlayer):  | 
|     addValue = __GetCostVIPData(curPlayer, dataKey = CostVIPData_BZZDExpAddRate)  | 
|     if not addValue:  | 
|         return 0  | 
|     return addValue  | 
|   | 
| # ÇÀºì°üÿÈÕ¿ÉÇÀÔö¼Ó´ÎÊý  | 
| def GetRedPacketGrabCntAdd(curPlayer):  | 
|     addCnt = __GetCostVIPData(curPlayer, dataKey = CostVIPData_RedPacketGrabCnt)  | 
|     if not addCnt:  | 
|         return 0  | 
|     return addCnt  | 
|   | 
| # »÷ɱÊÀ½çboss´ÎÊýÔö¼Ó  | 
| def GetKillWorldBossAddCnt(curPlayer):  | 
|     addCnt = __GetCostVIPData(curPlayer, dataKey = CostVIPData_KillWorldBossAddCnt)  | 
|     if not addCnt:  | 
|         return 0  | 
|     return addCnt |