| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerFlashGiftbag  | 
| #  | 
| # @todo:ÏÞʱÀñ°ü  | 
| # @author hxp  | 
| # @date 2018-7-20  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ÏÞʱÀñ°ü  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2018-7-20 17:30"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import PyGameData  | 
| import ShareDefine  | 
| import PlayerControl  | 
| import IpyGameDataPY  | 
| import NetPackCommon  | 
| import ChPyNetSendPack  | 
| import DataRecordPack  | 
| import ItemControler  | 
| import PlayerWeekParty  | 
| import GameWorld  | 
| import ChConfig  | 
| import CommFunc  | 
| import PlayerCoin  | 
|   | 
|   | 
| def GetGiftbagTypeList(cfgID, dayIndex, woldLV):  | 
|     if cfgID == None or dayIndex == None:  | 
|         return []  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID)  | 
|     if not ipyData:  | 
|         return []  | 
|     giftbagTypeList = GameWorld.GetDictValueByRangeKey(ipyData.GetGiftbagTypeList(), woldLV, [])  | 
|     todayGiftbag = giftbagTypeList[-1] if dayIndex >= len(giftbagTypeList) else giftbagTypeList[dayIndex]  | 
|     return todayGiftbag  | 
|   | 
| def OnPlayerLogin(curPlayer):  | 
|       | 
|     for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {}).values():  | 
|         actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)  | 
|         isReset = __CheckPlayerFlashGiftbagAction(curPlayer, actNum)  | 
|         if not isReset:  | 
|             pass  | 
|           | 
|     return  | 
|   | 
| def RefreshFlashGiftbagActionInfo(actNum):  | 
|     ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     for index in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if curPlayer.GetID() == 0:  | 
|             continue  | 
|         __CheckPlayerFlashGiftbagAction(curPlayer, actNum)  | 
|     return  | 
|   | 
| def __CheckPlayerFlashGiftbagAction(curPlayer, actNum):  | 
|     ## ¼ì²éÍæ¼ÒÏÔʾÀñ°ü»î¶¯Êý¾ÝÐÅÏ¢  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|       | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashGiftbag, actNum)  | 
|     actID = actInfo.get(ShareDefine.ActKey_ID, 0)  | 
|     state = actInfo.get(ShareDefine.ActKey_State, 0)  | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|       | 
|     playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagID % actNum) # Íæ¼ÒÉíÉϵĻID  | 
|     giftbagTypeList = [] if not cfgID else GetGiftbagTypeList(cfgID, actInfo.get(ShareDefine.ActKey_DayIndex, 0), actInfo.get(ShareDefine.ActKey_WorldLV, 0))  | 
|     isReset = False  | 
|     if actID != playerActID:  | 
|         isReset = True  | 
|         Sync_FlashGiftbagActionInfo(curPlayer, actNum)  | 
|         __ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList, actNum)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagID % actNum, actID)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagMailState % actNum, 0)  | 
|         GameWorld.DebugLog("ÏÞʱÀñ°üÖØÖÃ! actNum=%s,actID=%s,playerActID=%s,state=%s,giftbagTypeList=%s"   | 
|                            % (actNum, actID, playerActID, state, giftbagTypeList), playerID)  | 
|     else:  | 
|         GameWorld.DebugLog("ÏÞʱÀñ°ü»î¶¯ID²»±ä£¬²»´¦Àí£¡actNum=%s,playerActID=%s" % (actNum, playerActID), curPlayer.GetPlayerID())  | 
|           | 
|     playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagMailState % actNum) # Íæ¼ÒÉíÉϵĻÌáÐÑÓʼþ״̬  | 
|     if actID and state and state != playerMailState:  | 
|         flashGiftbagIpyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID)  | 
|         if flashGiftbagIpyData and flashGiftbagIpyData.GetMailKey() and curPlayer.GetLV() >= flashGiftbagIpyData.GetLVLimit():  | 
|             PlayerControl.SendMailByKey(flashGiftbagIpyData.GetMailKey(), [playerID], flashGiftbagIpyData.GetMailItemPrize())  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagMailState % actNum, state)  | 
|             GameWorld.DebugLog("    ·¢ËÍÐÂÏÞʱÀñ°üÓʼþÌáÐÑ! state=%s,playerMailState=%s" % (state, playerMailState), playerID)  | 
|               | 
|     if not isReset and cfgID:  | 
|         Sync_FlashGiftbagActionInfo(curPlayer, actNum)  | 
|         if giftbagTypeList:  | 
|             SyncFlashGiftbagBuyCount(curPlayer, actNum, giftbagTypeList=giftbagTypeList)  | 
|     return isReset  | 
|   | 
| def __ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList, actNum):  | 
|     ##ÖØÖÃÏÞʱÀñ°üÏÞ¹ºÎïÆ·´ÎÊý  | 
|     syncIDList = []  | 
|     ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|     for i in xrange(ipyDataMgr.GetFlashGiftbagCount()):  | 
|         giftbag = ipyDataMgr.GetFlashGiftbagByIndex(i)  | 
|         if not giftbag.GetBuyCountLimit():  | 
|             continue  | 
|         if giftbag.GetGiftbagType() not in giftbagTypeList:  | 
|             continue  | 
|         buyCntKey = ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftbag.GetGiftbagID())  | 
|         if curPlayer.NomalDictGetProperty(buyCntKey) <= 0:  | 
|             continue  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, buyCntKey, 0)  | 
|         syncIDList.append(giftbag.GetGiftbagID())  | 
|     if syncIDList:  | 
|         SyncFlashGiftbagBuyCount(curPlayer, actNum, syncIDList)  | 
|     return  | 
|   | 
| def OnPlayerOrderGiftbag(curPlayer, giftbagIDList, addDRDict):  | 
|     ## Íæ¼Ò¶©¹ºÏÞʱÀñ°ü  | 
|       | 
|     canBuy = False  | 
|     for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {}).values():  | 
|         actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)  | 
|           | 
|         state = actInfo.get(ShareDefine.ActKey_State, 0)  | 
|         if not state:  | 
|             continue  | 
|           | 
|         cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|         giftbagTypeList = GetGiftbagTypeList(cfgID, actInfo.get(ShareDefine.ActKey_DayIndex, 0), actInfo.get(ShareDefine.ActKey_WorldLV, 0))  | 
|           | 
|         if not giftbagTypeList:  | 
|             continue  | 
|         actGiftbagType = giftbagTypeList[-1] if state > len(giftbagTypeList) else giftbagTypeList[state - 1]  | 
|         giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("FlashGiftbag", {"GiftbagType":actGiftbagType}, True, True)  | 
|         actGiftbagIDList = []  | 
|         giftbagIpyData = None  | 
|         for ipyData in giftbagIpyDataList:  | 
|             actGiftbagIDList.append(ipyData.GetGiftbagID())  | 
|             if ipyData.GetGiftbagID() in giftbagIDList:  | 
|                 giftbagIpyData = ipyData  | 
|                 break  | 
|               | 
|         if not giftbagIpyData:  | 
|             continue  | 
|           | 
|         flashGiftbagIpyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID)  | 
|         if not flashGiftbagIpyData:  | 
|             continue  | 
|         isJueban = flashGiftbagIpyData.GetIsJueban()  | 
|         if isJueban:  | 
|             for ipyData in giftbagIpyDataList:  | 
|                 juebanGiftbagID = ipyData.GetGiftbagID()  | 
|                 juebanBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, juebanGiftbagID))  | 
|                 if juebanGiftbagID not in giftbagIDList and juebanBuyCount > 0:  | 
|                     DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag JueBan pay limit! have already bought other giftbagID=%s" % juebanGiftbagID, addDRDict)  | 
|                     return  | 
|                   | 
|         giftbagID = giftbagIpyData.GetGiftbagID()  | 
|         giftItemList = __GetJobItemList(giftbagIpyData.GetGiftItemList(), curPlayer.GetJob())   | 
|         addDRDict.update({"giftbagID":giftbagID, "giftItemList":giftItemList})  | 
|         buyCountLimit = giftbagIpyData.GetBuyCountLimit()  | 
|         buyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftbagID))  | 
|         if buyCountLimit:  | 
|             addDRDict.update({"buyCountLimit":buyCountLimit, "buyCount":buyCount})  | 
|             if buyCount >= buyCountLimit:  | 
|                 PlayerCoin.ExchangePayCoin(curPlayer, "FlashGiftbag Pay count limit !buyCount=%s,buyCountLimit=%s"   | 
|                                            % (buyCount, buyCountLimit), addDRDict)  | 
|                 return  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftbagID), buyCount + 1)  | 
|           | 
|         if giftItemList:  | 
|             ItemControler.GivePlayerItemOrMail(curPlayer, giftItemList, "", event=[ChConfig.ItemGive_CTG, True, addDRDict])  | 
|           | 
|         # È¡Íæ¼ÒAPPID£¬»ì·þʹÓà  | 
|         appID = GameWorld.GetPlayerPlatform(curPlayer)  | 
|         notifyKey = giftbagIpyData.GetNotifyKey()  | 
|         if notifyKey:  | 
|             orderIpyData = GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID)  | 
|             rmb = "0" if not orderIpyData else str(orderIpyData.GetPayRMBNum()) # RMBÖ§³ÖСÊý£¬ÕâÀïÖ±½Óתstr¹ã²¥  | 
|             PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), rmb, giftbagIpyData.GetMainItemID()])  | 
|           | 
|         SyncFlashGiftbagBuyCount(curPlayer, actNum, [giftbagID])  | 
|         PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_GiftBag, actGiftbagType, False)  | 
|           | 
|         canBuy = True  | 
|         GameWorld.DebugLog("    ¹ºÂòÏÞʱÀñ°ü: actNum=%s,actGiftbagType=%s,giftbagID=%s,buyCount=%s,isJueban=%s"   | 
|                            % (actNum, actGiftbagType, giftbagID, buyCount + 1, isJueban))  | 
|         break  | 
|       | 
|     if not canBuy:  | 
|         DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag can not buy!", addDRDict)  | 
|         return  | 
|       | 
|     return True  | 
|   | 
| def __GetJobItemList(itemList, job):  | 
|     jobItemList = []  | 
|     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 SyncFlashGiftbagBuyCount(curPlayer, actNum, syncIDList=[], giftbagTypeList=[]):  | 
|     ## Í¨ÖªÏÞʱÀñ°üÍæ¼Ò»î¶¯ÐÅÏ¢  | 
|     giftbagBuyInfo = ChPyNetSendPack.tagMCFlashGiftbagPlayerInfo()  | 
|     giftbagBuyInfo.ActNum = actNum  | 
|     giftbagBuyInfo.BuyCountList = []  | 
|     if syncIDList:  | 
|         for giftID in syncIDList:  | 
|             buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftID))  | 
|             buyCountInfo = ChPyNetSendPack.tagMCFlashGiftbagBuyCount()  | 
|             buyCountInfo.GiftbagID = giftID  | 
|             buyCountInfo.BuyCount = buyCnt  | 
|             giftbagBuyInfo.BuyCountList.append(buyCountInfo)  | 
|     else:  | 
|         ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|         for i in xrange(ipyDataMgr.GetFlashGiftbagCount()):  | 
|             giftbag = ipyDataMgr.GetFlashGiftbagByIndex(i)  | 
|             if not giftbag.GetBuyCountLimit():  | 
|                 continue  | 
|             if giftbagTypeList and giftbag.GetGiftbagType() not in giftbagTypeList:  | 
|                 continue  | 
|             giftID = giftbag.GetGiftbagID()  | 
|             buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftID))  | 
|             if buyCnt <= 0:  | 
|                 continue  | 
|             buyCountInfo = ChPyNetSendPack.tagMCFlashGiftbagBuyCount()  | 
|             buyCountInfo.GiftbagID = giftID  | 
|             buyCountInfo.BuyCount = buyCnt  | 
|             giftbagBuyInfo.BuyCountList.append(buyCountInfo)  | 
|     giftbagBuyInfo.Count = len(giftbagBuyInfo.BuyCountList)  | 
|     NetPackCommon.SendFakePack(curPlayer, giftbagBuyInfo)  | 
|     return  | 
|   | 
| def Sync_FlashGiftbagActionInfo(curPlayer, actNum):  | 
|     ## Í¨ÖªÏÞʱÀñ°ü»î¶¯ÐÅÏ¢  | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashGiftbag, actNum)  | 
|     if not actInfo:  | 
|         return  | 
|       | 
|     #ÐèÒªÌáǰ֪ͨ£¬ËùÒÔÈ¥µô´ËÏÞÖÆ  | 
|     #if not actInfo.get(ShareDefine.ActKey_State):  | 
|     #    return  | 
|       | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     if not cfgID:  | 
|         return  | 
|     giftbagTypeList = GetGiftbagTypeList(cfgID, actInfo.get(ShareDefine.ActKey_DayIndex, 0), actInfo.get(ShareDefine.ActKey_WorldLV, 0))  | 
|       | 
|     if not giftbagTypeList:  | 
|         return  | 
|       | 
|     flashGiftbagIpyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID)  | 
|     if not flashGiftbagIpyData:  | 
|         return  | 
|       | 
|     startTimeList = flashGiftbagIpyData.GetStartTimeList()  | 
|     endTimeList = flashGiftbagIpyData.GetEndTimeList()  | 
|     if len(startTimeList) != len(endTimeList):  | 
|         GameWorld.ErrLog("ÏÞʱÀñ°ü¿ª¹ØÊ±¼äʱ·ÖÅäÖôíÎó!cfgID=%s" % cfgID)  | 
|         return  | 
|       | 
|     # È¡Íæ¼ÒAPPID£¬»ì·þʹÓà  | 
|     appID = GameWorld.GetPlayerPlatform(curPlayer)  | 
|       | 
|     startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(flashGiftbagIpyData)  | 
|     packInfo = ChPyNetSendPack.tagMCFlashGiftbagInfo()  | 
|     packInfo.ActNum = actNum  | 
|     packInfo.StartDate = startDateStr  | 
|     packInfo.EndtDate = endDateStr  | 
|     packInfo.AdvanceMinutes = flashGiftbagIpyData.GetAdvanceMinutes()  | 
|     packInfo.ActivityTime = []  | 
|     for i, startTime in enumerate(startTimeList):  | 
|         timeInfo = ChPyNetSendPack.tagMCFlashGiftbagTime()  | 
|         timeInfo.StartTime = startTime  | 
|         timeInfo.EndtTime = endTimeList[i]  | 
|         packInfo.ActivityTime.append(timeInfo)  | 
|     packInfo.ActivityTimeCount = len(packInfo.ActivityTime)  | 
|     packInfo.IsDayReset = flashGiftbagIpyData.GetIsDayReset()  | 
|     packInfo.LimitLV = flashGiftbagIpyData.GetLVLimit()  | 
|     packInfo.GiftbagTypeInfo = []  | 
|     for giftbagType in giftbagTypeList:  | 
|           | 
|         giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("FlashGiftbag", {"GiftbagType":giftbagType}, True, True)  | 
|         if not giftbagIpyDataList:  | 
|             continue  | 
|           | 
|         giftType = ChPyNetSendPack.tagMCFlashGiftbagType()  | 
|         giftType.GiftbagInfo = []  | 
|           | 
|         for giftIpyData in giftbagIpyDataList:  | 
|             giftbagID = giftIpyData.GetGiftbagID()  | 
|             orderIpyData = GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID)  | 
|             giftBag = ChPyNetSendPack.tagMCFlashGiftbag()  | 
|             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.RMBOriginal = CommFunc.RMBToCoin(giftIpyData.GetOriginalRMB())  | 
|             giftBag.ItemInfo = []  | 
|             for itemID, itemCount, isBind in __GetJobItemList(giftIpyData.GetGiftItemList(), curPlayer.GetJob()):  | 
|                 item = ChPyNetSendPack.tagMCFlashGiftbagItem()  | 
|                 item.ItemID = itemID  | 
|                 item.ItemCount = itemCount  | 
|                 item.IsBind = isBind  | 
|                 item.IsMainItem = int(itemID == giftIpyData.GetMainItemID())  | 
|                 giftBag.ItemInfo.append(item)  | 
|             giftBag.GiftItemCount = len(giftBag.ItemInfo)  | 
|             giftType.GiftbagInfo.append(giftBag)  | 
|               | 
|         giftType.GiftbagCount = len(giftType.GiftbagInfo)  | 
|         packInfo.GiftbagTypeInfo.append(giftType)  | 
|           | 
|     packInfo.GiftbagTypeCount = len(packInfo.GiftbagTypeInfo)  | 
|     NetPackCommon.SendFakePack(curPlayer, packInfo)  | 
|     return  | 
|   | 
| def GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID):  | 
|     ## »ñÈ¡Àñ°üID¶ÔӦʵ¼ÊÊÛ¼Û  | 
|     key = "FlashGiftbagIDRMB"  | 
|     FlashGiftbagIDRMBDict = IpyGameDataPY.GetConfigEx(key)  | 
|     if not FlashGiftbagIDRMBDict:  | 
|         FlashGiftbagIDRMBDict = {}  | 
|         ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|         for i in xrange(ipyDataMgr.GetOrderInfoCount()):  | 
|             ipyData = ipyDataMgr.GetOrderInfoByIndex(i)  | 
|             #if ipyData.GetAppID() != appID:  | 
|             #    continue  | 
|             if not ipyData.GetGiftbagID():  | 
|                 continue  | 
|             FlashGiftbagIDRMBDict[(ipyData.GetGiftbagID(), ipyData.GetAppID())] = ipyData  | 
|         IpyGameDataPY.SetConfigEx(key, FlashGiftbagIDRMBDict)  | 
|     return FlashGiftbagIDRMBDict.get((giftbagID, appID))  | 
|   |