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