#!/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 not GameWorld.IsNormalPlayer(curPlayer): 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 startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData) actPack = ChPyNetSendPack.tagMCFeastLoginInfo() actPack.Clear() actPack.StartDate = startDateStr actPack.EndtDate = endDateStr 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