#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package Player.PlayerFestivalLogin # # @todo:½ÚÈյǽ½±Àø # @author ljd # @date 2014-12-22 09:50 # @version 1.2 # # @change: "2015-01-06 17:40" ljd Ôö¼Óºǫ́¿ØÖÆÆðʼʱ¼äµÄ½ÚÈÕÀàÐÍ # @change: "2015-01-21 10:50" ljd ¸ÄDebugLogÊä³ö·½Ê½ # # ÏêϸÃèÊö: ½ÚÈյǽ½±Àø <Ôªµ©¡¢Ê¥µ®> # #--------------------------------------------------------------------- """Version = 2015-01-21 10:50""" #--------------------------------------------------------------------- import IPY_GameWorld import GameWorld import ChConfig import ReadChConfig import ItemCommon import PlayerControl import ItemControler import ChPyNetSendPack import NetPackCommon import ShareDefine # ½ÚÈÕÐÅÏ¢ÅäÖÃË÷Òý ( Festival_StartTime, Festival_EndTime, Festival_WarnTime, Festival_LimitLV, Festival_Reward, ) = range(5) # ½±Àø×´Ì¬ ( Reward_State_Not, Reward_State_Can, Reward_State_Yet, ) = range(3) # ¶¨ÒåÎïÆ·ÀàÐÍ ( Item_Type_Common, # Ò»°ãÎïÆ·±í Item_Type_Appoint, # ÌØÊâ¶¨ÖÆÎïÆ· ) = range(2) # ½±ÀøÐÅÏ¢ÅäÖÃλË÷Òý ( Reward_Item_Type, Reward_Item_Id, Reward_Item_Num, Reward_Item_IsBind, ) = range(4) ## OnDay ¼Ç¼²¢Í¨Öª½±Àø×´Ì¬ # @param curPlayer # @return None def OnDayFestivalLogin(curPlayer): __UpdateAwardState(curPlayer) ## OnLogin ¼Ç¼²¢Í¨Öª½±Àø×´Ì¬ # @param curPlayer # @return None def OnLoginFestivalLogin(curPlayer): __UpdateAwardState(curPlayer) ## ¸üн±Àø×´Ì¬ # @param curPlayer # @return None def __UpdateAwardState(curPlayer): festivalDict = ReadChConfig.GetEvalChConfig('FestivalLoginAward') curTime = GameWorld.GetCurrentTime() for festivalType, curFestival in festivalDict.items(): if curPlayer.GetLV() < curFestival[Festival_LimitLV]: GameWorld.DebugLog("__UpdateAwardState() player level(%s) not enough"%curPlayer.GetLV()) continue startTime = __GetFestivalTime(curFestival, Festival_StartTime, festivalType) endTime = __GetFestivalTime(curFestival, Festival_EndTime, festivalType) warnTime = __GetFestivalTime(curFestival, Festival_WarnTime, festivalType) # ֪ͨ½±ÀøÊ±¼ä if not GameWorld.IsAtActTime(curTime, [startTime, warnTime]): GameWorld.DebugLog("__UpdateAwardState() curTime(%s) startTime(%s) wardTime(%s)" %(curTime, startTime, warnTime)) continue # »î¶¯Ê±¼ä if GameWorld.IsAtActTime(curTime, [startTime, endTime]): __SetCanState(curPlayer, curFestival, festivalType) NotifyAwardState(curPlayer, festivalType) ## ÁìÈ¡½ÚÈյǽ½±Àø # @param index # @param clientPack # @param tick # @return def GetFestivalLoginAward(index, clientPack, tick): festivalType = clientPack.FestivalType dayIndex = clientPack.DayIndex GameWorld.DebugLog("==[PlayerFestivalLogin]== In->GetFestivalLoginAward() festival[%s]=%s" %(festivalType, dayIndex)) curFestival = __GetFestivalInfo(festivalType) if not curFestival: return curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) loginState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FestivalLoginState%festivalType) if curPlayer.GetLV() < curFestival[Festival_LimitLV]: GameWorld.DebugLog("GetFestivalLoginAward() player level(%s) not enough"%curPlayer.GetLV()) return # ´¦Àíµ±Ç°×´Ì¬ curState = GameWorld.GetDataByDigitPlace(loginState, dayIndex) if curState != Reward_State_Can: GameWorld.DebugLog("GetFestivalLoginAward() loginState(%s)"%loginState) return startTime = __GetFestivalTime(curFestival, Festival_StartTime, festivalType) curDayIndex = GameWorld.GetPastHour(startTime) / 24 if dayIndex > curDayIndex: GameWorld.DebugLog("GetFestivalLoginAward() day(%s) curDay(%s)"%(dayIndex, curDayIndex)) return itemList = __GetRewardList(curPlayer, curFestival, dayIndex) if not __CheckRewardList(curPlayer, itemList): return loginState = GameWorld.ChangeDataByDigitPlace(loginState, dayIndex, Reward_State_Yet) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FestivalLoginState%festivalType, loginState) __GiveReward(curPlayer, itemList) GameWorld.DebugLog("==[PlayerFestivalLogin]== Out->GetFestivalLoginAward() state(%s)"%loginState) NotifyAwardState(curPlayer, festivalType) return ## ֪ͨ½ÚÈյǽ½±Àø # @param curPlayer # @return None def NotifyAwardState(curPlayer, festivalType): sendPack = ChPyNetSendPack.tagMCFestivalLoginAwardState() sendPack.Clear() sendPack.FestivalType = festivalType sendPack.State = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FestivalLoginState%festivalType) NetPackCommon.SendFakePack(curPlayer, sendPack) return ## »ñÈ¡½ÚÈÕÀàÐÍÁбí # @param None # @return ½±ÀøÀàÐÍÁбí def GetFestivalTypeList(): festivalInfo = ReadChConfig.GetEvalChConfig('FestivalLoginAward') return festivalInfo.keys() ## ÖØÖýÚÈÕ½±Àø×´Ì¬ # @param curPlayer # @param festivalType ½ÚÈÕÀàÐÍ # @param isNotify ÊÇ·ñ֪ͨ½±Àø±ä¸ü # @return None def ResetFestivalAward(curPlayer, festivalType, isNotify=False): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FestivalLoginState%festivalType, 0) if isNotify: NotifyAwardState(curPlayer, festivalType) ## ¸üн±Àø×´Ì¬ # @param curPlayer # @param curFestival µ±Ç°½ÚÈÕ # @param festivalType ½ÚÈÕÀàÐÍ # @return None def __SetCanState(curPlayer, curFestival, festivalType): loginState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FestivalLoginState%festivalType) startTime = __GetFestivalTime(curFestival, Festival_StartTime, festivalType) dayIndex = GameWorld.GetPastHour(startTime) / 24 curState = GameWorld.GetDataByDigitPlace(loginState, dayIndex) # ¼ì²é»î¶¯½áÊøÊ±¼ä if curState != Reward_State_Not: GameWorld.DebugLog("__SetCanState() day(%s) curState(%s)"%(dayIndex, curState)) return loginState = GameWorld.ChangeDataByDigitPlace(loginState, dayIndex, Reward_State_Can) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FestivalLoginState%festivalType, loginState) ## »ñÈ¡µ±Ç°½ÚÈÕÐÅÏ¢ # @param festivalType ½ÚÈÕÀàÐÍ # @return µ±Ç°½ÚÈÕÐÅÏ¢ def __GetFestivalInfo(festivalType): festivalInfo = ReadChConfig.GetEvalChConfig('FestivalLoginAward') curFestival = festivalInfo.get(festivalType) if not curFestival: GameWorld.DebugLog("__GetFestivalInfo() festival(%s) isn't configuration"%festivalType) return startTime = __GetFestivalTime(curFestival, Festival_StartTime, festivalType) warnTime = __GetFestivalTime(curFestival, Festival_WarnTime, festivalType) curTime = GameWorld.GetCurrentTime() if not GameWorld.IsAtActTime(curTime, [startTime, warnTime]): GameWorld.DebugLog("__GetFestivalInfo() curTime(%s) startTime(%s) wardTime(%s)" %(curTime, startTime, warnTime)) return return curFestival ## »ñÈ¡½ÚÈÕʱ¼ä # @param curFestival µ±Ç°½ÚÈÕ # @param timeType ʱ¼äÀàÐÍ # @param festivalType ½ÚÈÕÀàÐÍ # @return ʱ¼ä <¸ñʽ:%Y-%m-%d %H:%M:%S> def __GetFestivalTime(curFestival, timeType, festivalType): festivalTime = curFestival[timeType] if festivalTime: return festivalTime if timeType == Festival_StartTime: tickTimeKey = ShareDefine.Def_Notify_WorldKey_LoginAwardStartDate%festivalType else: tickTimeKey = ShareDefine.Def_Notify_WorldKey_LoginAwardEndDate%festivalType tickTime = GameWorld.GetGameWorld().GetGameWorldDictByKey(tickTimeKey) return str(GameWorld.ChangeTimeNumToDatetime(tickTime)) ## ·¢·Å½±ÀøÎïÆ· # @param curPlayer # @param itemList ½±ÀøÎïÆ·Áбí # @return None def __GiveReward(curPlayer, itemList): for itemInfo in itemList: itemType = itemInfo[Reward_Item_Type] itemId = itemInfo[Reward_Item_Id] itemNum = itemInfo[Reward_Item_Num] itemIsBind = itemInfo[Reward_Item_IsBind] if itemNum <= 0: continue if itemType == Item_Type_Common: ItemControler.GivePlayerItem(curPlayer, itemId, itemNum, itemIsBind, [IPY_GameWorld.rptItem], True) elif itemType == Item_Type_Appoint: ItemControler.GivePlayerAppointItem(curPlayer, itemId, itemIsBind, True) ## ½±ÀøÎïÆ·Áбí # @param curPlayer # @param itemList ½±ÀøÎïÆ·Áбí # @return ÊÇ·ñ¿ÉÒÔ·¢·ÅÎïÆ· def __CheckRewardList(curPlayer, itemList): if not itemList: GameWorld.DebugLog("__CheckRewardList() Reward item list(%s) Null"%itemList) return False packSpaceNum = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem) if len(itemList) > packSpaceNum: PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371") return False return True ## »ñÈ¡½±ÀøÁбí # @param curPlayer # @param curFestival µ±Ç°½ÚÈÕ # @param stateIndex ½±Àø×´Ì¬Ë÷Òý # @return ½±ÀøÎïÆ·Áбí def __GetRewardList(curPlayer, curFestival, stateIndex): rewardInfoDict = curFestival[Festival_Reward] rewardInfo = rewardInfoDict.get(stateIndex, {}) heroJob = curPlayer.GetJob() # °´Ö°ÒµÈ¡½±ÀøÎïÆ·Áбí for jobs, items in rewardInfo.items(): if heroJob in jobs: return items[:] GameWorld.DebugLog("__GetRewardList() Not find job(%s)"%heroJob) return rewardInfo.get(())