#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerCostRebate  
 | 
#  
 | 
# @todo:Ïû·Ñ·µÀû»î¶¯  
 | 
# @author hxp  
 | 
# @date 2018-7-16  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: Ïû·Ñ·µÀû»î¶¯  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2018-7-16 12:00"""  
 | 
#-------------------------------------------------------------------------------  
 | 
  
 | 
import PyGameData  
 | 
import ShareDefine  
 | 
import PlayerControl  
 | 
import IpyGameDataPY  
 | 
import ItemControler  
 | 
import ChPyNetSendPack  
 | 
import DataRecordPack  
 | 
import IPY_GameWorld  
 | 
import NetPackCommon  
 | 
import ItemCommon  
 | 
import GameWorld  
 | 
import ChConfig  
 | 
  
 | 
  
 | 
def OnPlayerLogin(curPlayer):  
 | 
    isReset = __CheckPlayerCostRebateAction(curPlayer)  
 | 
    if not isReset:  
 | 
        actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {})  
 | 
        # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢  
 | 
        if actCostRebateInfo.get(ShareDefine.ActKey_State):  
 | 
            Sync_CostRebateActionInfo(curPlayer)  
 | 
            Sync_CostRebateInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
def RefreshCostRebateActionInfo():  
 | 
    ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢  
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
    for index in xrange(playerManager.GetPlayerCount()):  
 | 
        curPlayer = playerManager.GetPlayerByIndex(index)  
 | 
        if curPlayer.GetID() == 0:  
 | 
            continue  
 | 
        __CheckPlayerCostRebateAction(curPlayer)  
 | 
    return  
 | 
  
 | 
def __CheckPlayerCostRebateAction(curPlayer):  
 | 
    ## ¼ì²éÍæ¼ÒÏû·Ñ·µÀû»î¶¯Êý¾ÝÐÅÏ¢  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
      
 | 
    actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {})  
 | 
    costRebateID = actCostRebateInfo.get(ShareDefine.ActKey_ID, 0)  
 | 
    state = actCostRebateInfo.get(ShareDefine.ActKey_State, 0)  
 | 
      
 | 
    playerCostRebateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateID) # Íæ¼ÒÉíÉϵĻID  
 | 
      
 | 
    # »î¶¯ID ÏàͬµÄ»°²»´¦Àí  
 | 
    if costRebateID == playerCostRebateID:  
 | 
        #GameWorld.DebugLog("Ïû·Ñ·µÀû»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    templateID = actCostRebateInfo.get(ShareDefine.ActKey_TemplateID, 0)  
 | 
    playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateTemplateID)  
 | 
      
 | 
    GameWorld.DebugLog("Ïû·Ñ·µÀûÖØÖÃ! costRebateID=%s,playerCostRebateID=%s,state=%s,templateID=%s,playerTemplateID=%s"   
 | 
                       % (costRebateID, playerCostRebateID, state, templateID, playerTemplateID), playerID)  
 | 
      
 | 
    # Î´ÁìÈ¡µÄ½±ÀøÓʼþ·¢·Å  
 | 
    __SendCostRebateMail(curPlayer, playerTemplateID)  
 | 
      
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateID, costRebateID)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateTemplateID, templateID)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateGold, 0)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateAwardRecord, 0)  
 | 
      
 | 
    Sync_CostRebateActionInfo(curPlayer)  
 | 
    Sync_CostRebateInfo(curPlayer)  
 | 
    return True  
 | 
  
 | 
def __SendCostRebateMail(curPlayer, playerTemplateID):  
 | 
    # Î´ÁìÈ¡µÄ½±ÀøÓʼþ·¢·Å  
 | 
      
 | 
    if not playerTemplateID:  
 | 
        return  
 | 
      
 | 
    costGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold)  
 | 
    if not costGold:  
 | 
        return  
 | 
      
 | 
    ipyDataList = IpyGameDataPY.GetIpyGameDataList("CostRebateTemplate", playerTemplateID)  
 | 
    if not ipyDataList:  
 | 
        return  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
    batchPlayerIDList, batchAddItemList, batchParamList = [], [], []  
 | 
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateAwardRecord)  
 | 
      
 | 
    for ipyData in ipyDataList:  
 | 
        awardIndex = ipyData.GetAwardIndex()  
 | 
        if awardRecord & pow(2, awardIndex):  
 | 
            continue  
 | 
          
 | 
        needCostGold = ipyData.GetNeedCostGold()  
 | 
        if costGold < needCostGold:  
 | 
            continue  
 | 
        awardRecord |= pow(2, awardIndex)   
 | 
          
 | 
        awardItemList = ipyData.GetAwardItemList()  
 | 
        batchPlayerIDList.append([playerID])  
 | 
        batchAddItemList.append(awardItemList)  
 | 
        batchParamList.append([needCostGold])  
 | 
          
 | 
    if batchPlayerIDList:  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateAwardRecord, awardRecord)  
 | 
        PlayerControl.SendMailBatch("ConsumptionRebateMail", batchPlayerIDList, batchAddItemList, batchParamList)  
 | 
          
 | 
    return  
 | 
  
 | 
def AddCostRebateGold(curPlayer, costType, costGold, infoDict):  
 | 
    if costGold <= 0:  
 | 
        return  
 | 
    if costType in ChConfig.CostRebate_DisableType:  
 | 
        GameWorld.DebugLog("²»¼ÆÈëÏû·Ñ·µÀûµÄÏû·ÑÀàÐÍ!costType=%s" % costType, curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {})  
 | 
    if not actCostRebateInfo.get(ShareDefine.ActKey_State):  
 | 
        GameWorld.DebugLog("Ïû·Ñ·µÀû»î¶¯µ±Ç°Î´¿ªÆô!")  
 | 
        return  
 | 
      
 | 
    actID = actCostRebateInfo.get(ShareDefine.ActKey_ID)  
 | 
    templateID = actCostRebateInfo.get(ShareDefine.ActKey_TemplateID)  
 | 
    if not actID or not templateID:  
 | 
        GameWorld.ErrLog("Ïû·Ñ·µÀû»î¶¯Êý¾ÝÒì³£!actID=%s,templateID=%s" % (actID, templateID), curPlayer.GetPlayerID())  
 | 
        return  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateID, actID)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateTemplateID, templateID)  
 | 
      
 | 
    curCostGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold)  
 | 
    updCostGold = curCostGold + costGold  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateGold, updCostGold)  
 | 
    Sync_CostRebateInfo(curPlayer)  
 | 
    GameWorld.DebugLog("Íæ¼ÒÏû·Ñ·µÀû»î¶¯: actID=%s,templateID=%s,curCostGold=%s,costGold=%s,updCostGold=%s"   
 | 
                       % (actID, templateID, curCostGold, costGold, updCostGold), curPlayer.GetPlayerID())  
 | 
    return  
 | 
  
 | 
def OnGetCostRebateAward(curPlayer, awardIndex):  
 | 
    ## ÁìÈ¡Ïû·Ñ·µÀû½±Àø  
 | 
  
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
      
 | 
    actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {})  
 | 
    costRebateID = actCostRebateInfo.get(ShareDefine.ActKey_ID, 0)  
 | 
    state = actCostRebateInfo.get(ShareDefine.ActKey_State, 0)  
 | 
    templateID = actCostRebateInfo.get(ShareDefine.ActKey_TemplateID, 0)  
 | 
    if not state or not templateID:  
 | 
        GameWorld.DebugLog("ûÓÐÏû·Ñ·µÀû»î¶¯£¬ÎÞ·¨Áì½±£¡state=%s,templateID=%s" % (state, templateID), playerID)  
 | 
        return  
 | 
      
 | 
    playerCostRebateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateID) # Íæ¼ÒÉíÉϵĻID  
 | 
    if costRebateID != playerCostRebateID:  
 | 
        return  
 | 
      
 | 
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateAwardRecord)  
 | 
    if awardRecord & pow(2, awardIndex):  
 | 
        GameWorld.DebugLog("ÒѾÁìÈ¡¹ý¸ÃÏû·Ñ·µÀû»î¶¯½±Àø!awardIndex=%s" % awardIndex, playerID)  
 | 
        return  
 | 
      
 | 
    ipyDataList = IpyGameDataPY.GetIpyGameDataList("CostRebateTemplate", templateID)  
 | 
    if not ipyDataList:  
 | 
        return  
 | 
      
 | 
    awardIpyData = None  
 | 
    for ipyData in ipyDataList:  
 | 
        if ipyData.GetAwardIndex() == awardIndex:  
 | 
            awardIpyData = ipyData  
 | 
            break  
 | 
          
 | 
    if not awardIpyData:  
 | 
        GameWorld.DebugLog("ÕÒ²»µ½¸Ã·µÀû»î¶¯µµÎ»Ë÷Òý½±Àø!templateID=%s,awardIndex=%s" % (templateID, awardIndex), playerID)  
 | 
        return  
 | 
      
 | 
    needCostGold = awardIpyData.GetNeedCostGold()  
 | 
    awardItemList = awardIpyData.GetAwardItemList()  
 | 
      
 | 
    curCostGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold)  
 | 
    if curCostGold < needCostGold:  
 | 
        GameWorld.DebugLog("ËùÐèÏû·ÑÏÉÓñÊý²»×㣬ÎÞ·¨ÁìÈ¡!templateID=%s,awardIndex=%s,needCostGold=%s,curCostGold=%s"   
 | 
                           % (templateID, awardIndex, needCostGold, curCostGold), playerID)  
 | 
        return  
 | 
      
 | 
    needSpace = len(awardItemList)  
 | 
    packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  
 | 
    if packSpace < needSpace:  
 | 
        return  
 | 
      
 | 
    awardRecord |= pow(2, awardIndex)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateAwardRecord, awardRecord)  
 | 
    Sync_CostRebateInfo(curPlayer)  
 | 
      
 | 
    notifyKey = awardIpyData.GetNotifyKey()  
 | 
    if notifyKey:  
 | 
        PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), needCostGold])  
 | 
          
 | 
    for itemID, itemCount, isBind in awardItemList:  
 | 
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem])  
 | 
          
 | 
    addDataDict = {"TemplateID":templateID, "NeedCostGold":needCostGold, "AwardIndex":awardIndex,  
 | 
                   "ItemList":str(awardItemList)}  
 | 
    DataRecordPack.DR_FuncGiveItem(curPlayer, "CostRebateAward", addDataDict)  
 | 
    return  
 | 
  
 | 
def Sync_CostRebateInfo(curPlayer):  
 | 
    ## Í¨ÖªÏû·Ñ·µÀûÍæ¼ÒÊý¾ÝÐÅÏ¢  
 | 
    playerActInfo = ChPyNetSendPack.tagMCCostRebatePlayerInfo()  
 | 
    playerActInfo.CostGoldTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold)  
 | 
    playerActInfo.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateAwardRecord)  
 | 
    NetPackCommon.SendFakePack(curPlayer, playerActInfo)  
 | 
    return  
 | 
  
 | 
def Sync_CostRebateActionInfo(curPlayer):  
 | 
    ## Í¨ÖªÏû·Ñ·µÀû»î¶¯ÐÅÏ¢  
 | 
    actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {})  
 | 
    if not actCostRebateInfo:  
 | 
        return  
 | 
      
 | 
    if not actCostRebateInfo.get(ShareDefine.ActKey_State):  
 | 
        return  
 | 
      
 | 
    templateIDList = actCostRebateInfo.get(ShareDefine.ActKey_TemplateIDList)  
 | 
    if not templateIDList:  
 | 
        return  
 | 
      
 | 
    actInfo = ChPyNetSendPack.tagMCCostRebateInfo()  
 | 
    actInfo.StartDate = actCostRebateInfo.get(ShareDefine.ActKey_StartDate, "")  
 | 
    actInfo.EndtDate = actCostRebateInfo.get(ShareDefine.ActKey_EndDate, "")  
 | 
    actInfo.LimitLV = actCostRebateInfo.get(ShareDefine.ActKey_LVLimit, 0)  
 | 
    actInfo.IsDayReset = actCostRebateInfo.get(ShareDefine.ActKey_IsDayReset, 0)  
 | 
    actInfo.AwardDayInfo = []  
 | 
    for templateID in templateIDList:  
 | 
        ipyDataList = IpyGameDataPY.GetIpyGameDataList("CostRebateTemplate", templateID)  
 | 
        if not ipyDataList:  
 | 
            continue  
 | 
          
 | 
        dayInfo = ChPyNetSendPack.tagMCCostRebateAwardDay()  
 | 
        dayInfo.AwardInfo = []  
 | 
        for ipyData in ipyDataList:  
 | 
            awardInfo = ChPyNetSendPack.tagMCCostRebateAward()  
 | 
            awardInfo.AwardIndex = ipyData.GetAwardIndex()  
 | 
            awardInfo.NeedGold = ipyData.GetNeedCostGold()  
 | 
            awardInfo.AwardItem = []  
 | 
            for itemID, itemCount, isBind in ipyData.GetAwardItemList():  
 | 
                awardItem = ChPyNetSendPack.tagMCCostRebateAwardItem()  
 | 
                awardItem.ItemID = itemID  
 | 
                awardItem.ItemCount = itemCount  
 | 
                awardItem.IsBind = isBind  
 | 
                awardInfo.AwardItem.append(awardItem)  
 | 
            awardInfo.AwardItemCount = len(awardInfo.AwardItem)  
 | 
              
 | 
            dayInfo.AwardInfo.append(awardInfo)  
 | 
              
 | 
        dayInfo.AwardCount = len(dayInfo.AwardInfo)  
 | 
        actInfo.AwardDayInfo.append(dayInfo)  
 | 
          
 | 
    actInfo.AwardDays = len(actInfo.AwardDayInfo)  
 | 
    NetPackCommon.SendFakePack(curPlayer, actInfo)  
 | 
    return  
 | 
  
 | 
  
 |