| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerLuckyTreasure  | 
| #  | 
| # @todo:ÐÒÔ˼ø±¦  | 
| # @author xdh  | 
| # @date 2019-2-12 19:50  | 
| # @version 1.0  | 
| #  | 
| #  | 
| # ÏêϸÃèÊö: ÐÒÔ˼ø±¦  | 
| #  | 
| #---------------------------------------------------------------------  | 
| """Version = 2019-2-12 19:50"""  | 
| #---------------------------------------------------------------------  | 
|   | 
| import IPY_GameWorld  | 
| import GameWorld  | 
| import ChConfig  | 
| import IpyGameDataPY  | 
| import PlayerControl  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import ShareDefine  | 
| import PyGameData  | 
| import ItemControler  | 
| import ItemCommon  | 
|   | 
|   | 
|   | 
| def OnLogin(curPlayer):  | 
|     isReset = __CheckPlayerLuckyTreasureAction(curPlayer)  | 
|     if not isReset:  | 
|         actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})  | 
|         # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢  | 
|         if actCostRebateInfo.get(ShareDefine.ActKey_State):  | 
|             SyncLuckyTreasureInfo(curPlayer)  | 
|             SyncLuckyTreasureResultInfo(curPlayer)  | 
|           | 
|     return  | 
|   | 
| def RefreshLuckyTreasureAction():  | 
|     __InitLuckyTreasureRateList()  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     for i in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(i)  | 
|         if curPlayer == None or not curPlayer.GetInitOK():  | 
|             continue  | 
|         __CheckPlayerLuckyTreasureAction(curPlayer)  | 
|     return  | 
|   | 
| def __CheckPlayerLuckyTreasureAction(curPlayer):  | 
|     ## ¼ì²éÍæ¼ÒÐÒÔ˼ø±¦»î¶¯Êý¾ÝÐÅÏ¢  | 
|     global g_randomWellDict  | 
|   | 
|     playerID = curPlayer.GetPlayerID()  | 
|       | 
|     actLuckyTreasureInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})  | 
|     LuckyTreasureID = actLuckyTreasureInfo.get(ShareDefine.ActKey_ID, 0)  | 
|     state = actLuckyTreasureInfo.get(ShareDefine.ActKey_State, 0)  | 
|     #cfgID = actLuckyTreasureInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     worldLV = actLuckyTreasureInfo.get(ShareDefine.ActKey_WorldLV, 0)  | 
|     playerLuckyTreasureID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasureID)  # Íæ¼ÒÉíÉϵĻID  | 
|       | 
|     # »î¶¯ID ÏàͬµÄ»°²»´¦Àí  | 
|     if LuckyTreasureID == playerLuckyTreasureID:  | 
|         #GameWorld.DebugLog("ÐÒÔ˼ø±¦»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID())  | 
|         return  | 
|     msgStr = str([ShareDefine.Def_UniversalGameRecType_LuckyTreasure, 2])  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'DelUniversalGameRec', msgStr, len(msgStr))  | 
|     GameWorld.DebugLog("ÐÒÔ˼ø±¦ÖØÖÃ! LuckyTreasureID=%s,playerLuckyTreasureID=%s,state=%s,worldLv=%s"   | 
|                        % (LuckyTreasureID, playerLuckyTreasureID, state, worldLV), playerID)  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureID, LuckyTreasureID)  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureFree, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasurePoint, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureCnt, 0)  | 
|       | 
|       | 
|     SyncLuckyTreasureInfo(curPlayer)  | 
|     SyncLuckyTreasureResultInfo(curPlayer)  | 
|     return True  | 
|   | 
| def __InitLuckyTreasureRateList():  | 
|     global g_itemRateList  | 
|     actLuckyTreasureInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})  | 
|     state = actLuckyTreasureInfo.get(ShareDefine.ActKey_State, 0)  | 
|     cfgID = actLuckyTreasureInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     worldLV = actLuckyTreasureInfo.get(ShareDefine.ActKey_WorldLV, 0)  | 
|     if not cfgID or not worldLV or not state:  | 
|         return  | 
|     actIpyData = IpyGameDataPY.GetIpyGameData("ActLuckyTreasure", cfgID)  | 
|     if not actIpyData:  | 
|         return  | 
|     templateID = actIpyData.GetTemplateID()  | 
|     ipyDataList = IpyGameDataPY.GetIpyGameDataList('LuckyTreasureTemplate', templateID)  | 
|     if not ipyDataList:  | 
|         return  | 
|     tWeight = 0  | 
|     g_itemRateList = []  | 
|     for ipyData in ipyDataList:  | 
|         worldLVLimit = ipyData.GetWorldLVLimit()  | 
|         if worldLV < worldLVLimit[0] or worldLV > worldLVLimit[1]:  | 
|             continue  | 
|         itemID = ipyData.GetItemID()  | 
|         itemCnt = ipyData.GetItemCnt()  | 
|         isBind = ipyData.GetIsBind()  | 
|         weight = ipyData.GetWeight()  | 
|         tWeight += weight  | 
|         g_itemRateList.append([tWeight, [itemID, itemCnt, isBind]])  | 
|     return  | 
|   | 
| def __GetRandomRateList():  | 
|     if not g_itemRateList:  | 
|         __InitLuckyTreasureRateList()  | 
|     return g_itemRateList  | 
|   | 
|   | 
| #// AA 08 ¿ªÊ¼ÐÒÔ˼ø±¦ #tagCMStartLuckyTreasure  | 
| #struct    tagCMStartLuckyTreasure  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| def OnStartLuckyTreasure(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})  | 
|     state = actBossRebornInfo.get(ShareDefine.ActKey_State, 0)  | 
|     cfgID = actBossRebornInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     if not state or not cfgID:  | 
|         return  | 
|     actIpyData = IpyGameDataPY.GetIpyGameData("ActLuckyTreasure", cfgID)  | 
|     if not actIpyData:  | 
|         return  | 
|       | 
|     hasFree = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasureFree)  | 
|     if hasFree:  | 
|         costMoney = IpyGameDataPY.GetFuncCfg('LuckyAppraisal')  | 
|         if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costMoney):  | 
|             return  | 
|     # ¼ì²é±³°ü  | 
|     needSpace = 1  | 
|     packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  | 
|     if needSpace > packSpace:  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")  | 
|         return  | 
|       | 
|     randomRateList = __GetRandomRateList()  | 
|     if not randomRateList:  | 
|         return  | 
|     greatItem = randomRateList[-1][1]  | 
|       | 
|     curLuckyPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasurePoint)  | 
|     curLuckyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasureCnt)  | 
|       | 
|     maxLuckyPoint = actIpyData.GetLuckyPoint()  | 
|     singlePoint = IpyGameDataPY.GetFuncCfg('LuckyAppraisal', 2)  | 
|     if curLuckyPoint + singlePoint >= maxLuckyPoint:  | 
|         giveItem = greatItem  | 
|         newLuckyPoint = 0  | 
|     else:  | 
|         if curLuckyCnt < IpyGameDataPY.GetFuncCfg('LuckyAppraisal', 3):  | 
|             #ǰX´Î¼ø±¦²»Äܳö´ó½±  | 
|             randomResultList = GameWorld.GetResultByRandomListEx(randomRateList[:-1], 1, [])  | 
|         else:  | 
|             randomResultList = GameWorld.GetResultByRandomListEx(randomRateList, 1, [])  | 
|         if len(randomResultList) != 1:  | 
|             GameWorld.DebugLog('    ¿ªÊ¼ÐÒÔ˼ø±¦ Ëæ»ú¿â½á¹û »ñÈ¡´íÎ󠣡')  | 
|             return  | 
|         giveItem = randomResultList[0]  | 
|     if giveItem == greatItem:  | 
|         newLuckyPoint = 0  | 
|         playerName = curPlayer.GetName()  | 
|         PlayerControl.WorldNotify(0, 'LuckyAppraisal_1', [playerName, greatItem[0]])  | 
|         msgStr = str([ShareDefine.Def_UniversalGameRecType_LuckyTreasure, [], [curPlayer.GetName()], 2, 0])  | 
|         GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'AddUniversalGameRec', msgStr, len(msgStr))  | 
|   | 
|     else:  | 
|         newLuckyPoint = curLuckyPoint + singlePoint  | 
|     if hasFree:  | 
|         PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costMoney, ChConfig.Def_Cost_LuckyTreasure)  | 
|     else:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureFree, 1)  | 
|     #¸üÐÂÐÒÔËÖµ  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasurePoint, newLuckyPoint)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureCnt, curLuckyCnt + 1)  | 
|       | 
|     for itemID, itemCount, isBind in [giveItem]:  | 
|         ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem], event=[ChConfig.ItemGive_LuckyTreasure, False, {"isFree":not hasFree}])  | 
|       | 
|     SyncLuckyTreasureResultInfo(curPlayer, giveItem)  | 
|     return  | 
|   | 
|   | 
| def SyncLuckyTreasureInfo(curPlayer):  | 
|     ##ͬ²½ÐÒÔ˼ø±¦»î¶¯ÐÅÏ¢  | 
|     actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})  | 
|     state = actBossRebornInfo.get(ShareDefine.ActKey_State, 0)  | 
|     cfgID = actBossRebornInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     if not state or not cfgID:  | 
|         return  | 
|     actIpyData = IpyGameDataPY.GetIpyGameData("ActLuckyTreasure", cfgID)  | 
|     if not actIpyData:  | 
|         return  | 
|     startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(actIpyData)  | 
|     actInfo = ChPyNetSendPack.tagMCLuckyTreasureInfo()  | 
|     actInfo.Clear()  | 
|     actInfo.StartDate = startDateStr  | 
|     actInfo.EndtDate = endDateStr  | 
|     actInfo.ResetType = actIpyData.GetResetType()  | 
|     actInfo.LimitLV = actIpyData.GetLVLimit()  | 
|     actInfo.LuckyPoint = actIpyData.GetLuckyPoint()  | 
|     actInfo.ItemList = []  | 
|     randomItemList = __GetRandomRateList()  | 
|     for itemInfo in randomItemList:  | 
|         itemID, itemCnt, isBind = itemInfo[1]  | 
|         wellItemInfo = ChPyNetSendPack.tagMCLuckyTreasureItem()  | 
|         wellItemInfo.ItemID = itemID  | 
|         wellItemInfo.ItemCnt = itemCnt  | 
|         wellItemInfo.IsBind = isBind  | 
|         actInfo.ItemList.append(wellItemInfo)  | 
|     actInfo.Count = len(actInfo.ItemList)  | 
|     NetPackCommon.SendFakePack(curPlayer, actInfo)  | 
|     return  | 
|   | 
|   | 
| def SyncLuckyTreasureResultInfo(curPlayer, itemInfo=[]):  | 
|     ##ͬ²½ÐÒÔ˼ø±¦Íæ¼ÒÐÅÏ¢  | 
|     packInfo = ChPyNetSendPack.tagMCLuckyTreasureResultInfo()  | 
|     packInfo.Clear()  | 
|     packInfo.LuckyPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasurePoint)  | 
|     packInfo.HasFree = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasureFree)  | 
|     if itemInfo:  | 
|         packInfo.ItemID = itemInfo[0]  | 
|         packInfo.ItemCnt = itemInfo[1]  | 
|         packInfo.IsBind = itemInfo[2]  | 
|     NetPackCommon.SendFakePack(curPlayer, packInfo)  | 
|     return  |