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