#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package Player.PlayerFeastLogin  
 | 
#  
 | 
# @todo:½ÚÈյǼ  
 | 
# @author hxp  
 | 
# @date 2021-01-27  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: ½ÚÈյǼ  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2021-01-27 17:00"""  
 | 
#-------------------------------------------------------------------------------  
 | 
  
 | 
import PyGameData  
 | 
import ShareDefine  
 | 
import PlayerControl  
 | 
import IpyGameDataPY  
 | 
import ChPyNetSendPack  
 | 
import ItemControler  
 | 
import IPY_GameWorld  
 | 
import NetPackCommon  
 | 
import GameWorld  
 | 
import ChConfig  
 | 
  
 | 
def OnPlayerLogin(curPlayer):  
 | 
    isReset = __CheckPlayerFeastLoginAction(curPlayer)  
 | 
    if not isReset:  
 | 
        actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastLogin, {})  
 | 
        # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢  
 | 
        if actInfo.get(ShareDefine.ActKey_State):  
 | 
            __SetLoginByDayIndex(curPlayer, actInfo)  
 | 
            Sync_FeastLoginActionInfo(curPlayer)  
 | 
            Sync_FeastLoginPlayerInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
def RefreshFeastLoginActionInfo():  
 | 
    ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢  
 | 
    playerManager = GameWorld.GetPlayerManager()  
 | 
    for index in xrange(playerManager.GetPlayerCount()):  
 | 
        curPlayer = playerManager.GetPlayerByIndex(index)  
 | 
        if curPlayer.GetID() == 0:  
 | 
            continue  
 | 
        __CheckPlayerFeastLoginAction(curPlayer)  
 | 
    return  
 | 
  
 | 
def __CheckPlayerFeastLoginAction(curPlayer):  
 | 
    ## ¼ì²éÍæ¼Ò»î¶¯ÐÅÏ¢  
 | 
      
 | 
    playerID = curPlayer.GetPlayerID()  
 | 
      
 | 
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastLogin, {})  
 | 
    actID = actInfo.get(ShareDefine.ActKey_ID, 0)  
 | 
    state = actInfo.get(ShareDefine.ActKey_State, 0)  
 | 
      
 | 
    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastLoginID) # Íæ¼ÒÉíÉϵĻID  
 | 
    # »î¶¯ID ÏàͬµÄ»°²»´¦Àí  
 | 
    if actID == playerActID:  
 | 
        GameWorld.DebugLog("½ÚÈյǼ»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID())  
 | 
        if state:  
 | 
            if __SetLoginByDayIndex(curPlayer, actInfo):  
 | 
                Sync_FeastLoginPlayerInfo(curPlayer)  
 | 
        return  
 | 
    GameWorld.DebugLog("½ÚÈյǼ»î¶¯ÖØÖÃ! actID=%s,playerActID=%s,state=%s" % (actID, playerActID, state), playerID)  
 | 
      
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastLoginID, actID)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastLoginState, 0)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastLoginAwardState, 0)  
 | 
      
 | 
    if state:  
 | 
        __SetLoginByDayIndex(curPlayer, actInfo)  
 | 
        Sync_FeastLoginActionInfo(curPlayer)  
 | 
        Sync_FeastLoginPlayerInfo(curPlayer)  
 | 
    return True  
 | 
  
 | 
def __SetLoginByDayIndex(curPlayer, actInfo):  
 | 
    ## ÉèÖÃijһÌìÒѵǼ£¬¿ÉÁì½±  
 | 
    dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)  
 | 
    loginState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastLoginState)  
 | 
    loginCount, lastRecordDay = loginState / 10, loginState % 10  
 | 
    curDay = dayIndex + 1  
 | 
    if lastRecordDay >= curDay:  
 | 
        GameWorld.DebugLog("    ½ÚÈյǼδ´ï¼Ç¼¼µÇÌì»òÒѼǼµÇ¼! dayIndex=%s,loginState=%s,lastRecordDay(%s) >= curDay(%s)" % (dayIndex, loginState, lastRecordDay, curDay))  
 | 
        return  
 | 
    loginCount += 1  
 | 
    updLoginState = loginCount * 10 + curDay  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastLoginState, updLoginState)  
 | 
    GameWorld.DebugLog("    ½ÚÈյǼÉèÖÃÌìµÇ¼: dayIndex=%s,loginState=%s,updLoginState=%s,loginCount=%s" % (dayIndex, loginState, updLoginState, loginCount))  
 | 
    return True  
 | 
  
 | 
def GetFeastLoginAward(curPlayer, dayNum):  
 | 
    ## ÁìÈ¡»î¶¯½±Àø  
 | 
      
 | 
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastLogin, {})  
 | 
    if not actInfo:  
 | 
        return  
 | 
      
 | 
    if not actInfo.get(ShareDefine.ActKey_State):  
 | 
        GameWorld.DebugLog("·Ç½ÚÈյǼ»î¶¯ÖУ¡")  
 | 
        return  
 | 
      
 | 
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)  
 | 
      
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("ActFeastLogin", cfgID)  
 | 
    if not ipyData:  
 | 
        return  
 | 
      
 | 
    worldLV = actInfo.get(ShareDefine.ActKey_WorldLV)  
 | 
    templateID = GameWorld.GetDictValueByRangeKey(ipyData.GetTemplateIDInfo(), worldLV, 0)  
 | 
    if not templateID:  
 | 
        return  
 | 
      
 | 
    dayIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastLoginAward", templateID)  
 | 
    if not dayIpyDataList:  
 | 
        return  
 | 
      
 | 
    findIpyData = None  
 | 
    for dayIpyData in dayIpyDataList:  
 | 
        if dayIpyData.GetDayNum() == dayNum:  
 | 
            findIpyData = dayIpyData  
 | 
            break  
 | 
          
 | 
    if not findIpyData:  
 | 
        GameWorld.DebugLog("ÕÒ²»µ½¶ÔÓ¦µÄÌì½±Àø! dayNum=%s" % dayNum)  
 | 
        return  
 | 
      
 | 
    awardIndex = dayNum - 1  
 | 
    loginState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastLoginState)  
 | 
    loginCount = loginState / 10  
 | 
    if dayNum > loginCount:  
 | 
        GameWorld.DebugLog("½ÚÈյǼ»î¶¯µÇ¼Ìì²»×㣬ÎÞ·¨Áì½±£¡dayNum=%s > loginCount=%s,loginState=%s" % (dayNum, loginCount, loginState))  
 | 
        return  
 | 
      
 | 
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastLoginAwardState)  
 | 
    if awardRecord & pow(2, awardIndex):  
 | 
        GameWorld.DebugLog("½ÚÈյǼ»î¶¯¸ÃÌìÒÑÁì½±£¡dayNum=%s,awardIndex=%s,awardRecord=%s" % (dayNum, awardIndex, awardRecord))  
 | 
        return  
 | 
      
 | 
    awardItemList = findIpyData.GetLoginAwardItemList()  
 | 
    if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList):  
 | 
        return  
 | 
      
 | 
    updAwardRecord = awardRecord | pow(2, awardIndex)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastLoginAwardState, updAwardRecord)  
 | 
    Sync_FeastLoginPlayerInfo(curPlayer)  
 | 
      
 | 
    GameWorld.DebugLog("ÁìÈ¡½ÚÈյǼ½±Àø£¡dayNum=%s,awardIndex=%s,awardItemList=%s" % (dayNum, awardIndex, awardItemList))  
 | 
      
 | 
    for itemID, itemCount, isAuctionItem in awardItemList:  
 | 
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem],   
 | 
                                     event=["FeastLogin", False, {}])  
 | 
          
 | 
    return  
 | 
  
 | 
def Sync_FeastLoginPlayerInfo(curPlayer):  
 | 
    ## Í¨Öª»î¶¯Íæ¼ÒÐÅÏ¢  
 | 
    loginState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastLoginState)  
 | 
    loginCount = loginState / 10  
 | 
    clientPack = ChPyNetSendPack.tagMCFeastLoginPlayerInfo()  
 | 
    clientPack.LoginState = pow(2, loginCount) - 1  
 | 
    clientPack.LoginAward = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastLoginAwardState)  
 | 
    NetPackCommon.SendFakePack(curPlayer, clientPack)  
 | 
    return  
 | 
  
 | 
def Sync_FeastLoginActionInfo(curPlayer):  
 | 
    ## Í¨Öª»î¶¯ÐÅÏ¢  
 | 
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastLogin, {})  
 | 
    if not actInfo:  
 | 
        return  
 | 
      
 | 
    if not actInfo.get(ShareDefine.ActKey_State):  
 | 
        return  
 | 
      
 | 
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)  
 | 
      
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("ActFeastLogin", cfgID)  
 | 
    if not ipyData:  
 | 
        return  
 | 
      
 | 
    worldLV = actInfo.get(ShareDefine.ActKey_WorldLV)  
 | 
    templateID = GameWorld.GetDictValueByRangeKey(ipyData.GetTemplateIDInfo(), worldLV, 0)  
 | 
    if not templateID:  
 | 
        return  
 | 
      
 | 
    dayIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastLoginAward", templateID)  
 | 
    if not dayIpyDataList:  
 | 
        return  
 | 
      
 | 
    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1  
 | 
    actPack = ChPyNetSendPack.tagMCFeastLoginInfo()  
 | 
    actPack.Clear()  
 | 
    actPack.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)  
 | 
    actPack.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)  
 | 
    actPack.LimitLV = ipyData.GetLVLimit()  
 | 
    actPack.DayAwardList = []  
 | 
    for dayIpyData in dayIpyDataList:  
 | 
        dayInfo = ChPyNetSendPack.tagMCFeastLoginDayAward()  
 | 
        dayInfo.DayNum = dayIpyData.GetDayNum()  
 | 
        dayInfo.AwardItemList = []  
 | 
        for itemID, itemCount, isAuctionItem in dayIpyData.GetLoginAwardItemList():  
 | 
            itemInfo = ChPyNetSendPack.tagMCFeastLoginDayAwardItem()  
 | 
            itemInfo.ItemID = itemID  
 | 
            itemInfo.ItemCount = itemCount  
 | 
            itemInfo.IsBind = isAuctionItem  
 | 
            dayInfo.AwardItemList.append(itemInfo)  
 | 
        dayInfo.AwardCount = len(dayInfo.AwardItemList)  
 | 
          
 | 
        actPack.DayAwardList.append(dayInfo)  
 | 
    actPack.DayCount = len(actPack.DayAwardList)  
 | 
    NetPackCommon.SendFakePack(curPlayer, actPack)  
 | 
    return  
 | 
  
 |