#!/usr/bin/python 
 | 
# -*- coding: GBK -*- 
 | 
#------------------------------------------------------------------------------- 
 | 
# 
 | 
##@package Player.PlayerActBuyOne 
 | 
# 
 | 
# @todo:ÂòÒ»ËͶà»î¶¯ 
 | 
# @author hxp 
 | 
# @date 2023-08-01 
 | 
# @version 1.0 
 | 
# 
 | 
# ÏêϸÃèÊö: ÂòÒ»ËͶà»î¶¯ 
 | 
# 
 | 
#------------------------------------------------------------------------------- 
 | 
#"""Version = 2023-08-01 16:00""" 
 | 
#------------------------------------------------------------------------------- 
 | 
  
 | 
import PyGameData 
 | 
import ShareDefine 
 | 
import PlayerControl 
 | 
import IpyGameDataPY 
 | 
import ChPyNetSendPack 
 | 
import DataRecordPack 
 | 
import NetPackCommon 
 | 
import ItemControler 
 | 
import IPY_GameWorld 
 | 
import PlayerCoin 
 | 
import GameWorld 
 | 
import ChConfig 
 | 
  
 | 
RecordIndexMax = 10 # Ã¿¸öÄ£°å×î´óÖ§³Ö³äÖµIDÊý 
 | 
  
 | 
def OnPlayerLogin(curPlayer): 
 | 
     
 | 
    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BuyOne, {}).values(): 
 | 
        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) 
 | 
        isReset = __CheckPlayerBuyOneAction(curPlayer, actNum) 
 | 
        # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢ 
 | 
        if not isReset and actInfo.get(ShareDefine.ActKey_State): 
 | 
            Sync_BuyOneActionInfo(curPlayer, actNum) 
 | 
            Sync_BuyOnePlayerInfo(curPlayer, actNum) 
 | 
             
 | 
    return 
 | 
  
 | 
def RefreshBuyOneActionInfo(actNum): 
 | 
    ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ 
 | 
    playerManager = GameWorld.GetPlayerManager() 
 | 
    for index in xrange(playerManager.GetPlayerCount()): 
 | 
        curPlayer = playerManager.GetPlayerByIndex(index) 
 | 
        if curPlayer.GetID() == 0: 
 | 
            continue 
 | 
        __CheckPlayerBuyOneAction(curPlayer, actNum) 
 | 
    return 
 | 
  
 | 
  
 | 
def __CheckPlayerBuyOneAction(curPlayer, actNum): 
 | 
    ## ¼ì²éÍæ»î¶¯Êý¾ÝÐÅÏ¢ 
 | 
     
 | 
    playerID = curPlayer.GetPlayerID() 
 | 
     
 | 
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyOne, actNum) 
 | 
    actID = actInfo.get(ShareDefine.ActKey_ID, 0) 
 | 
    state = actInfo.get(ShareDefine.ActKey_State, 0) 
 | 
    #cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) 
 | 
    #dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0) 
 | 
     
 | 
    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyOneID % actNum) # Íæ¼ÒÉíÉϵĻID 
 | 
     
 | 
    # »î¶¯ID ÏàͬµÄ»°²»´¦Àí 
 | 
    if actID == playerActID: 
 | 
        GameWorld.DebugLog("ÂòÒ»ËͶà»î¶¯ID²»±ä£¬²»´¦Àí£¡ actID=%s" % actID, curPlayer.GetPlayerID()) 
 | 
        return 
 | 
    GameWorld.DebugLog("ÂòÒ»ËͶà»î¶¯ÖØÖÃ! actID=%s,playerActID=%s,state=%s" % (actID, playerActID, state), playerID) 
 | 
     
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyOneID % actNum, actID) 
 | 
    for i in range(RecordIndexMax): 
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, i), 0) 
 | 
         
 | 
    if state: 
 | 
        # ÖØÖóäÖµID³äÖµ¼Ç¼ 
 | 
        __ResetCTGIDCount(curPlayer, actInfo) 
 | 
         
 | 
        Sync_BuyOneActionInfo(curPlayer, actNum) 
 | 
        Sync_BuyOnePlayerInfo(curPlayer, actNum) 
 | 
         
 | 
    return True 
 | 
  
 | 
def __ResetCTGIDCount(curPlayer, actInfo): 
 | 
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID) 
 | 
    dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0) 
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("ActBuyOne", cfgID) 
 | 
    if not ipyData: 
 | 
        return 
 | 
    templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex) 
 | 
    if not templateID: 
 | 
        return 
 | 
    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBuyOneTemplate", templateID) 
 | 
    if not tempIpyDataList: 
 | 
        return 
 | 
    resetCTGIDList = [] 
 | 
    for tempIpyData in tempIpyDataList: 
 | 
        resetCTGIDList.append(tempIpyData.GetNeedCTGID()) 
 | 
    PlayerCoin.DoResetCTGCountByIDList(curPlayer, "ActBuyOne", resetCTGIDList) 
 | 
    return 
 | 
  
 | 
def GetBuyOneFreeAward(curPlayer, awardIndex, actNum): 
 | 
    '''»î¶¯Ãâ·Ñ½±Àø 
 | 
    @param awardIndex: ½±ÀøË÷Òý = recordIndex*100 + freeIndex 
 | 
    @param actNum: »î¶¯±àºÅ£¬Èç11 »ò  12 ´ú±í²»Í¬µÄ»î¶¯ 
 | 
    ''' 
 | 
    playerID = curPlayer.GetPlayerID() 
 | 
     
 | 
    actNum = GameWorld.ToIntDef(actNum, 0) 
 | 
    if actNum <= 0: 
 | 
        GameWorld.Log("ûÓÐÖ¸¶¨ÁìÈ¡µÄ»î¶¯±àºÅ! actNum=%s" % actNum, playerID) 
 | 
        return 
 | 
     
 | 
    recordIndex = awardIndex / 100 
 | 
    freeIndex = awardIndex % 100 
 | 
     
 | 
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyOne, actNum) 
 | 
     
 | 
    if not actInfo.get(ShareDefine.ActKey_State): 
 | 
        GameWorld.Log("ÂòÒ»ËÍÒ»·Ç»î¶¯ÖÐÎÞ·¨ÁìÈ¡½±Àø! actNum=%s" % actNum, playerID) 
 | 
        return 
 | 
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID) 
 | 
    dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0) 
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("ActBuyOne", cfgID) 
 | 
    if not ipyData: 
 | 
        return 
 | 
    templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex) 
 | 
    if not templateID: 
 | 
        return 
 | 
     
 | 
    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBuyOneTemplate", templateID) 
 | 
    if not tempIpyDataList: 
 | 
        return 
 | 
     
 | 
    needCTGID = 0 
 | 
    freeItemList = [] 
 | 
     
 | 
    for tempIpyData in tempIpyDataList: 
 | 
        if recordIndex != tempIpyData.GetRecordIndex(): 
 | 
            continue 
 | 
        needCTGID = tempIpyData.GetNeedCTGID() 
 | 
        freeItemInfo = tempIpyData.GetFreeItemInfo() 
 | 
        freeItemList = freeItemInfo.get(freeIndex, []) 
 | 
        break 
 | 
     
 | 
    if not needCTGID or not freeItemList: 
 | 
        GameWorld.ErrLog("ÂòÒ»ËÍÒ»»î¶¯Ã»Óиý±ÀøÐÅÏ¢! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,freeIndex=%s"  
 | 
                         % (actNum, cfgID, templateID, recordIndex, freeIndex), playerID) 
 | 
        return 
 | 
     
 | 
    totalBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CTGGoodsBuyCount % needCTGID) 
 | 
    if not totalBuyCount: 
 | 
        GameWorld.Log("ÂòÒ»ËÍÒ»»î¶¯¸Ã½±ÀøÎ´³äÖµ£¬ÎÞ·¨Ãâ·ÑÁìÈ¡! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,needCTGID=%s"  
 | 
                      % (actNum, cfgID, templateID, recordIndex, needCTGID), playerID) 
 | 
        return 
 | 
     
 | 
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, recordIndex)) 
 | 
    if awardRecord & pow(2, freeIndex): 
 | 
        GameWorld.Log("ÂòÒ»ËÍÒ»»î¶¯ÒѾÁìÈ¡¹ý¸ÃÃâ·Ñ½±Àø! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,freeIndex=%s"  
 | 
                      % (actNum, cfgID, templateID, recordIndex, freeIndex), playerID) 
 | 
        return 
 | 
     
 | 
    # ¼ì²é±³°ü 
 | 
    if not ItemControler.CheckPackSpaceEnough(curPlayer, freeItemList): 
 | 
        return 
 | 
     
 | 
    awardRecord |= pow(2, freeIndex) 
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, recordIndex), awardRecord) 
 | 
    Sync_BuyOnePlayerInfo(curPlayer, actNum) 
 | 
     
 | 
    for itemID, itemCount, isAuctionItem in freeItemList: 
 | 
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem]) 
 | 
         
 | 
    addDataDict = {"templateID":templateID, "cfgID":cfgID, "recordIndex":recordIndex, "freeIndex":freeIndex, 
 | 
                   "freeItemList":str(freeItemList), "actNum":actNum} 
 | 
    DataRecordPack.DR_FuncGiveItem(curPlayer, "ActBuyOne", addDataDict) 
 | 
    GameWorld.Log("ÂòÒ»ËÍÒ»»î¶¯ÁìÈ¡Ãâ·Ñ½±Àø! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,freeIndex=%s,freeItemList=%s"  
 | 
                  % (actNum, cfgID, templateID, recordIndex, freeIndex, freeItemList), playerID) 
 | 
    return 
 | 
  
 | 
def Sync_BuyOnePlayerInfo(curPlayer, actNum): 
 | 
    ## Í¨ÖªÍæ¼ÒÊý¾ÝÐÅÏ¢ 
 | 
    clientPack = ChPyNetSendPack.tagMCActBuyOnePlayerInfo() 
 | 
    clientPack.ActNum = actNum 
 | 
    clientPack.FreeRecordList = [] 
 | 
    for i in range(RecordIndexMax): 
 | 
        awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, i)) 
 | 
        clientPack.FreeRecordList.append(awardRecord) 
 | 
    clientPack.FreeRecordCount = len(clientPack.FreeRecordList) 
 | 
    NetPackCommon.SendFakePack(curPlayer, clientPack) 
 | 
    return 
 | 
  
 | 
def Sync_BuyOneActionInfo(curPlayer, actNum): 
 | 
    ## Í¨Öª»î¶¯ÐÅÏ¢ 
 | 
     
 | 
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyOne, actNum) 
 | 
    if not actInfo.get(ShareDefine.ActKey_State): 
 | 
        return 
 | 
     
 | 
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID) 
 | 
    dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0) 
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("ActBuyOne", cfgID) 
 | 
    if not ipyData: 
 | 
        return 
 | 
    templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex) 
 | 
    if not templateID: 
 | 
        return 
 | 
    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBuyOneTemplate", templateID) 
 | 
    if not tempIpyDataList: 
 | 
        return 
 | 
     
 | 
    startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData) 
 | 
    startDateSync = actInfo.get(ShareDefine.ActKey_StartDateSync, startDateStr) 
 | 
    actInfo = ChPyNetSendPack.tagMCActBuyOneInfo() 
 | 
    actInfo.ActNum = actNum 
 | 
    actInfo.StartDate = startDateSync 
 | 
    actInfo.EndtDate = endDateStr 
 | 
    actInfo.LimitLV = ipyData.GetLVLimit() 
 | 
    actInfo.IsDayReset = ipyData.GetIsDayReset() 
 | 
    actInfo.GiftbagList = [] 
 | 
     
 | 
    for tempIpyData in tempIpyDataList: 
 | 
        giftbag = ChPyNetSendPack.tagMCActBuyOneInfoGiftbag() 
 | 
        giftbag.CTGID = tempIpyData.GetNeedCTGID() 
 | 
        giftbag.RecordIndex = tempIpyData.GetRecordIndex() 
 | 
        giftbag.FreeGiftList = [] 
 | 
         
 | 
        freeItemInfo = tempIpyData.GetFreeItemInfo() 
 | 
        freeIndexList = freeItemInfo.keys() 
 | 
        freeIndexList.sort() 
 | 
        for freeIndex in freeIndexList: 
 | 
            freeGift = ChPyNetSendPack.tagMCActBuyOneInfoFreeGift() 
 | 
            freeGift.FreeIndex = freeIndex 
 | 
            freeGift.FreeItemList = [] 
 | 
            freeItemList = freeItemInfo[freeIndex] 
 | 
            for itemID, itemCount, isAuctionItem in freeItemList: 
 | 
                freeItem = ChPyNetSendPack.tagMCActBuyOneInfoFreeItem() 
 | 
                freeItem.ItemID = itemID 
 | 
                freeItem.ItemCount = itemCount 
 | 
                freeItem.IsBind = isAuctionItem 
 | 
                freeGift.FreeItemList.append(freeItem) 
 | 
            freeGift.FreeItemCount = len(freeGift.FreeItemList) 
 | 
            giftbag.FreeGiftList.append(freeGift) 
 | 
             
 | 
        giftbag.FreeGiftCount = len(giftbag.FreeGiftList) 
 | 
         
 | 
        actInfo.GiftbagList.append(giftbag) 
 | 
         
 | 
    actInfo.GiftbagCount = len(actInfo.GiftbagList) 
 | 
    NetPackCommon.SendFakePack(curPlayer, actInfo) 
 | 
    return 
 |