| #!/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 IPY_GameWorld  | 
| import ItemCommon  | 
| import GameWorld  | 
| import ChConfig  | 
|   | 
|   | 
| def OnPlayerLogin(curPlayer):  | 
|     isReset = __CheckPlayerFlashGiftbagAction(curPlayer)  | 
|     if not isReset:  | 
|         actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})  | 
|         # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢  | 
|         if actInfo.get(ShareDefine.ActKey_State):  | 
|             SyncFlashGiftbagBuyCount(curPlayer, giftbagTypeList=actInfo.get(ShareDefine.ActKey_GiftbagTypeList, []))  | 
|             Sync_FlashGiftbagActionInfo(curPlayer)  | 
|     return  | 
|   | 
| def RefreshFlashGiftbagActionInfo():  | 
|     ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     for index in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if curPlayer.GetID() == 0:  | 
|             continue  | 
|         __CheckPlayerFlashGiftbagAction(curPlayer)  | 
|     return  | 
|   | 
| def __CheckPlayerFlashGiftbagAction(curPlayer):  | 
|     ## ¼ì²éÍæ¼ÒÏÔʾÀñ°ü»î¶¯Êý¾ÝÐÅÏ¢  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|       | 
|     actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})  | 
|     actID = actInfo.get(ShareDefine.ActKey_ID, 0)  | 
|     state = actInfo.get(ShareDefine.ActKey_State, 0)  | 
|     giftbagTypeList = actInfo.get(ShareDefine.ActKey_GiftbagTypeList, [])  | 
|     #if not state or not giftbagTypeList:  | 
|     #    return  | 
|       | 
|     playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagID) # Íæ¼ÒÉíÉϵĻID  | 
|       | 
|     # »î¶¯ID ÏàͬµÄ»°²»´¦Àí  | 
|     if actID == playerActID:  | 
|         GameWorld.DebugLog("ÏÞʱÀñ°ü»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagID, actID)  | 
|     ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList)  | 
|       | 
|     GameWorld.DebugLog("ÏÞʱÀñ°üÖØÖÃ! actID=%s,playerActID=%s,state=%s,giftbagTypeList=%s" % (actID, playerActID, state, giftbagTypeList), playerID)  | 
|       | 
|     Sync_FlashGiftbagActionInfo(curPlayer)  | 
|     return True  | 
|   | 
| def ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList):  | 
|     ##ÖØÖÃÏÞʱÀñ°üÏÞ¹ºÎïÆ·´ÎÊý  | 
|     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 % giftbag.GetGiftbagID()  | 
|         if curPlayer.NomalDictGetProperty(buyCntKey) <= 0:  | 
|             continue  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, buyCntKey, 0)  | 
|         syncIDList.append(giftbag.GetGiftbagID())  | 
|     if syncIDList:  | 
|         SyncFlashGiftbagBuyCount(curPlayer, syncIDList)  | 
|     return  | 
|   | 
| def OnPlayerOrderGiftbag(curPlayer, giftbagIDList, addDRDict):  | 
|     ## Íæ¼Ò¶©¹ºÏÞʱÀñ°ü  | 
|     actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})  | 
|     if not actInfo:  | 
|         DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag action info is null!", addDRDict)  | 
|         return  | 
|       | 
|     actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})  | 
|     state = actInfo.get(ShareDefine.ActKey_State, 0)  | 
|     if not state:  | 
|         DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag state is 0!", addDRDict)  | 
|         return  | 
|       | 
|     giftbagTypeList = actInfo.get(ShareDefine.ActKey_GiftbagTypeList, [])  | 
|     if not giftbagTypeList:  | 
|         DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag GiftbagTypeList is null!", addDRDict)  | 
|         return  | 
|     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:  | 
|         DataRecordPack.DR_CTGError(curPlayer, "OrderInfo giftbagIDList=%s can not found actGiftbagID in actGiftbagIDList=%s,actGiftbagType=%s"   | 
|                                    % (giftbagIDList, actGiftbagIDList, actGiftbagType), addDRDict)  | 
|         return  | 
|       | 
|     giftbagID = giftbagIpyData.GetGiftbagID()  | 
|     giftItemList = giftbagIpyData.GetGiftItemList()  | 
|     addDRDict.update({"giftbagID":giftbagID, "giftItemList":giftItemList})  | 
|     buyCountLimit = giftbagIpyData.GetBuyCountLimit()  | 
|     buyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % giftbagID)  | 
|     if buyCountLimit:  | 
|         addDRDict.update({"buyCountLimit":buyCountLimit, "buyCount":buyCount})  | 
|         if buyCount >= buyCountLimit:  | 
|             DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag Pay count limit !buyCount=%s,buyCountLimit=%s"   | 
|                                        % (buyCount, buyCountLimit), addDRDict)  | 
|             return  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagBuyCount % giftbagID, buyCount + 1)  | 
|       | 
|     if giftItemList:  | 
|         needSpace = len(giftItemList)  | 
|         emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  | 
|         if emptySpace < needSpace:  | 
|             PlayerControl.SendMailByKey("", [curPlayer.GetPlayerID()], giftItemList)  | 
|         else:  | 
|             for itemID, itemCount, isBind in giftItemList:  | 
|                 ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem],   | 
|                                              event=[ChConfig.ItemGive_CTG, True, addDRDict])  | 
|       | 
|     # È¡Íæ¼ÒAPPID£¬»ì·þʹÓà  | 
|     appID = GameWorld.GetPlayerPlatform(curPlayer.GetAccID())  | 
|     notifyKey = giftbagIpyData.GetNotifyKey()  | 
|     if notifyKey:  | 
|         orderIpyData = GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID)  | 
|         rmb = 0 if not orderIpyData else int(orderIpyData.GetPayRMBNum())  | 
|         PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), rmb, giftbagIpyData.GetMainItemID()])  | 
|           | 
|     SyncFlashGiftbagBuyCount(curPlayer, [giftbagID])  | 
|     return True  | 
|   | 
| def SyncFlashGiftbagBuyCount(curPlayer, syncIDList=[], giftbagTypeList=[]):  | 
|     ## Í¨ÖªÏÞʱÀñ°üÍæ¼Ò»î¶¯ÐÅÏ¢  | 
|     giftbagBuyInfo = ChPyNetSendPack.tagMCFlashGiftbagPlayerInfo()  | 
|     giftbagBuyInfo.BuyCountList = []  | 
|     if syncIDList:  | 
|         for giftID in syncIDList:  | 
|             buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % 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 % 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):  | 
|     ## Í¨ÖªÏÞʱÀñ°ü»î¶¯ÐÅÏ¢  | 
|     actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})  | 
|     if not actInfo:  | 
|         return  | 
|       | 
|     if not actInfo.get(ShareDefine.ActKey_State):  | 
|         return  | 
|       | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|     giftbagTypeList = actInfo.get(ShareDefine.ActKey_GiftbagTypeList, 0)  | 
|       | 
|     if not cfgID or 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.GetAccID())  | 
|       | 
|     packInfo = ChPyNetSendPack.tagMCFlashGiftbagInfo()  | 
|     packInfo.StartDate = flashGiftbagIpyData.GetStartDate()  | 
|     packInfo.EndtDate = flashGiftbagIpyData.GetEndDate()  | 
|     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 int(orderIpyData.GetPayRMBNum())  | 
|             giftBag.RMBOriginal = giftIpyData.GetOriginalRMB()  | 
|             giftBag.ItemInfo = []  | 
|             for itemID, itemCount, isBind in giftIpyData.GetGiftItemList():  | 
|                 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))  | 
|   |