| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerDailyGiftbag  | 
| #  | 
| # @todo:ÿÈÕÀñ°ü  | 
| # @author hxp  | 
| # @date 2020Äê3ÔÂ12ÈÕ  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: Ã¿ÈÕÀñ°ü  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2020Äê3ÔÂ12ÈÕ 12:00"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import PyGameData  | 
| import ShareDefine  | 
| import PlayerControl  | 
| import IpyGameDataPY  | 
| import NetPackCommon  | 
| import ChPyNetSendPack  | 
| import DataRecordPack  | 
| import ItemControler  | 
| import IPY_GameWorld  | 
| import ItemCommon  | 
| import GameWorld  | 
| import ChConfig  | 
| import CommFunc  | 
|   | 
| def OnPlayerLogin(curPlayer):  | 
|     __CheckPlayerDailyGiftbagAction(curPlayer)  | 
|     return  | 
|   | 
| def RefreshDailyGiftbagActionInfo():  | 
|     ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     for index in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if curPlayer.GetID() == 0:  | 
|             continue  | 
|         __CheckPlayerDailyGiftbagAction(curPlayer)  | 
|     return  | 
|   | 
| def __CheckPlayerDailyGiftbagAction(curPlayer):  | 
|     ## ¼ì²éÍæ¼ÒÿÈÕÀñ°ü»î¶¯Êý¾ÝÐÅÏ¢  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|       | 
|     actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_DailyGiftbag, {})  | 
|     actID = actInfo.get(ShareDefine.ActKey_ID, 0)  | 
|     state = actInfo.get(ShareDefine.ActKey_State, 0)  | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     if not state or not cfgID:  | 
|         return  | 
|       | 
|     playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyGiftbagID) # Íæ¼ÒÉíÉϵĻID  | 
|     cfgIpyData = IpyGameDataPY.GetIpyGameData("ActDailyGiftbag", cfgID)  | 
|     if not cfgIpyData:  | 
|         return  | 
|     giftbagType = cfgIpyData.GetGiftbagType()  | 
|       | 
|     isReset = False  | 
|     if actID != playerActID:  | 
|         isReset = True  | 
|         __ResetGiftbagItemBuyCount(curPlayer, giftbagType)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyGiftbagID, actID)  | 
|         GameWorld.DebugLog("ÿÈÕÀñ°üÖØÖÃ! actID=%s,playerActID=%s,state=%s,giftbagType=%s" % (actID, playerActID, state, giftbagType), playerID)  | 
|     else:  | 
|         GameWorld.DebugLog("ÿÈÕÀñ°ü»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID())  | 
|         SyncDailyGiftbagBuyCount(curPlayer, giftbagType)  | 
|           | 
|     Sync_DailyGiftbagActionInfo(curPlayer)  | 
|     return isReset  | 
|   | 
| def __ResetGiftbagItemBuyCount(curPlayer, giftbagType):  | 
|     ##ÖØÖÃÿÈÕÀñ°üÏÞ¹ºÎïÆ·´ÎÊý  | 
|       | 
|     giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("DailyGiftbag", {"GiftbagType":giftbagType}, True, True)  | 
|     if not giftbagIpyDataList:  | 
|         return  | 
|     for giftIpyData in giftbagIpyDataList:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyGiftbagBuyCount % giftIpyData.GetGiftbagID(), 0)  | 
|     SyncDailyGiftbagBuyCount(curPlayer, giftbagType)  | 
|     return  | 
|   | 
| def OnPlayerOrderDailyGiftbag(curPlayer, giftbagID, addDRDict, isCTG=True):  | 
|     ## Íæ¼Ò¶©¹ºÃ¿ÈÕÀñ°ü  | 
|     actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_DailyGiftbag, {})  | 
|     if not actInfo:  | 
|         if isCTG:  | 
|             DataRecordPack.DR_CTGError(curPlayer, "DailyGiftbag action info is null!", addDRDict)  | 
|         return  | 
|       | 
|     state = actInfo.get(ShareDefine.ActKey_State, 0)  | 
|     if not state:  | 
|         if isCTG:  | 
|             DataRecordPack.DR_CTGError(curPlayer, "DailyGiftbag state is 0!", addDRDict)  | 
|         return  | 
|       | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     cfgIpyData = IpyGameDataPY.GetIpyGameData("ActDailyGiftbag", cfgID)  | 
|     if not cfgIpyData:  | 
|         if isCTG:  | 
|             DataRecordPack.DR_CTGError(curPlayer, "DailyGiftbag GiftbagType is null!", addDRDict)  | 
|         return  | 
|     giftbagType = cfgIpyData.GetGiftbagType()  | 
|       | 
|     giftbagIpyData = IpyGameDataPY.GetIpyGameData("DailyGiftbag", giftbagType, giftbagID)  | 
|     if not giftbagIpyData:  | 
|         if isCTG:  | 
|             DataRecordPack.DR_CTGError(curPlayer, "DailyGiftbag giftbagType=%s giftbagID=%s can not found!"   | 
|                                        % (giftbagType, giftbagID), addDRDict)  | 
|         return  | 
|     actWorldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)  | 
|     giftItemList = __GetJobItemList(giftbagIpyData.GetGiftItemList(), curPlayer.GetJob(), actWorldLV)  | 
|     addDRDict.update({"giftbagType":giftbagType, "giftbagID":giftbagID, "giftItemList":giftItemList})  | 
|     buyCountLimit = giftbagIpyData.GetBuyCountLimit()  | 
|     buyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyGiftbagBuyCount % giftbagID)  | 
|     if buyCountLimit:  | 
|         addDRDict.update({"buyCountLimit":buyCountLimit, "buyCount":buyCount})  | 
|         if buyCount >= buyCountLimit:  | 
|             if isCTG:  | 
|                 DataRecordPack.DR_CTGError(curPlayer, "DailyGiftbag Pay count limit !buyCount=%s,buyCountLimit=%s"   | 
|                                            % (buyCount, buyCountLimit), addDRDict)  | 
|             return  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DailyGiftbagBuyCount % giftbagID, buyCount + 1)  | 
|       | 
|     if giftItemList:  | 
|         ItemControler.GivePlayerItemOrMail(curPlayer, giftItemList, "", event=[ChConfig.ItemGive_CTG, True, addDRDict])  | 
|                   | 
|     SyncDailyGiftbagBuyCount(curPlayer, giftbagType)  | 
|     return True  | 
|   | 
| def OnGetDailyFreeGiftbag(curPlayer):  | 
|     ## ÁìȡÿÈÕÃâ·ÑÖ±¹ºÀñ°ü  | 
|     giftbagID = 0 # Ãâ·ÑÀñ°üID¹Ì¶¨Îª0  | 
|     addDRDict = {}  | 
|     OnPlayerOrderDailyGiftbag(curPlayer, giftbagID, addDRDict, False)  | 
|     return  | 
|   | 
| def __GetJobItemList(giftItemInfo, job, worldLV):  | 
|     jobItemList = []  | 
|     if isinstance(giftItemInfo, dict):  | 
|         itemList = GameWorld.GetDictValueByRangeKey(giftItemInfo, worldLV, [])  | 
|     else:  | 
|         itemList = giftItemInfo  | 
|     for itemID, itemCnt, isBind in itemList:  | 
|         if type(itemID) == int:  | 
|             jobItemList.append([itemID, itemCnt, isBind])  | 
|         elif job in itemID:  | 
|             jobItemList.append([itemID[job], itemCnt, isBind])  | 
|     return jobItemList  | 
|   | 
| def SyncDailyGiftbagBuyCount(curPlayer, giftbagType):  | 
|     ## Í¨ÖªÃ¿ÈÕÀñ°üÍæ¼Ò»î¶¯ÐÅÏ¢  | 
|       | 
|     giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("DailyGiftbag", {"GiftbagType":giftbagType}, True, True)  | 
|     if not giftbagIpyDataList:  | 
|         return  | 
|       | 
|     giftbagBuyInfo = ChPyNetSendPack.tagMCDailyGiftbagPlayerInfo()  | 
|     giftbagBuyInfo.BuyCountList = []  | 
|     for giftIpyData in giftbagIpyDataList:  | 
|         giftbagID = giftIpyData.GetGiftbagID()  | 
|         buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DailyGiftbagBuyCount % giftbagID)  | 
|         if buyCnt <= 0:  | 
|             continue  | 
|         buyCountInfo = ChPyNetSendPack.tagMCDailyGiftbagBuyCount()  | 
|         buyCountInfo.GiftbagID = giftbagID  | 
|         buyCountInfo.BuyCount = buyCnt  | 
|         giftbagBuyInfo.BuyCountList.append(buyCountInfo)  | 
|     giftbagBuyInfo.Count = len(giftbagBuyInfo.BuyCountList)  | 
|     NetPackCommon.SendFakePack(curPlayer, giftbagBuyInfo)  | 
|     return  | 
|   | 
| def Sync_DailyGiftbagActionInfo(curPlayer):  | 
|     ## Í¨ÖªÃ¿ÈÕÀñ°ü»î¶¯ÐÅÏ¢  | 
|     actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_DailyGiftbag, {})  | 
|     if not actInfo:  | 
|         return  | 
|       | 
|     if not actInfo.get(ShareDefine.ActKey_State):  | 
|         return  | 
|       | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     if not cfgID:  | 
|         return  | 
|       | 
|     cfgIpyData = IpyGameDataPY.GetIpyGameData("ActDailyGiftbag", cfgID)  | 
|     if not cfgIpyData:  | 
|         return  | 
|     giftbagType = cfgIpyData.GetGiftbagType()  | 
|       | 
|     giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("DailyGiftbag", {"GiftbagType":giftbagType}, True, True)  | 
|     if not giftbagIpyDataList:  | 
|         return  | 
|       | 
|     actWorldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)  | 
|     # È¡Íæ¼ÒAPPID£¬»ì·þʹÓà  | 
|     appID = GameWorld.GetPlayerPlatform(curPlayer)  | 
|       | 
|     packInfo = ChPyNetSendPack.tagMCDailyGiftbagInfo()  | 
|     packInfo.GiftbagInfo = []  | 
|     packInfo.LimitLV = cfgIpyData.GetLVLimit()  | 
|     for giftIpyData in giftbagIpyDataList:  | 
|         giftbagID = giftIpyData.GetGiftbagID()  | 
|         orderIpyData = GetGiftbagIDOrderInfoIpyData(giftbagID, appID)  | 
|           | 
|         giftBag = ChPyNetSendPack.tagMCDailyGiftbag()  | 
|         giftBag.GiftID = giftbagID  | 
|         giftBag.OrderInfo = "" if not orderIpyData else orderIpyData.GetOrderInfo()  | 
|         giftBag.OrderInfoLen = len(giftBag.OrderInfo)  | 
|         giftBag.BuyCountLimit = giftIpyData.GetBuyCountLimit()  | 
|         giftBag.RMB = 0 if not orderIpyData else CommFunc.RMBToCoin(orderIpyData.GetPayRMBNum())  | 
|         giftBag.ItemInfo = []  | 
|         for itemID, itemCount, isBind in __GetJobItemList(giftIpyData.GetGiftItemList(), curPlayer.GetJob(), actWorldLV):  | 
|             item = ChPyNetSendPack.tagMCDailyGiftbagItem()  | 
|             item.ItemID = itemID  | 
|             item.ItemCount = itemCount  | 
|             giftBag.ItemInfo.append(item)  | 
|         giftBag.GiftItemCount = len(giftBag.ItemInfo)  | 
|         packInfo.GiftbagInfo.append(giftBag)  | 
|           | 
|     packInfo.GiftbagCount = len(packInfo.GiftbagInfo)  | 
|     NetPackCommon.SendFakePack(curPlayer, packInfo)  | 
|     return  | 
|   | 
| def GetGiftbagIDOrderInfoIpyData(giftbagID, appID):  | 
|     ## »ñÈ¡Àñ°üID¶ÔÓ¦Êý¾ÝÅäÖà  | 
|     key = "GiftbagIpyDataDict"  | 
|     GiftbagIpyDataDict = IpyGameDataPY.GetConfigEx(key)  | 
|     if not GiftbagIpyDataDict:  | 
|         GiftbagIpyDataDict = {}  | 
|         ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|         for i in xrange(ipyDataMgr.GetOrderInfoCount()):  | 
|             ipyData = ipyDataMgr.GetOrderInfoByIndex(i)  | 
|             if not ipyData.GetGiftbagID():  | 
|                 continue  | 
|             GiftbagIpyDataDict[(ipyData.GetGiftbagID(), ipyData.GetAppID())] = ipyData  | 
|         IpyGameDataPY.SetConfigEx(key, GiftbagIpyDataDict)  | 
|     return GiftbagIpyDataDict.get((giftbagID, appID))  | 
|   |