| #!/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)  | 
|   | 
| ## ÁìÈ¡½ÚÈյǽ½±Àø <AB 07·â°ü>  | 
| #  @param index  | 
| #  @param clientPack <FestivalType-½ÚÈÕÀàÐÍ DayIndex-½ÚÈÕÌì>  | 
| #  @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(())  |