#!/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))  
 | 
  
 |