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