#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
##@package PlayerOnlinePrize
|
#
|
# @todo: ´´½Ç7ÌìÔÚÏß½±Àø
|
# @author xdh
|
# @date 2018-03-06 17:00
|
# @version 1.0
|
#
|
#---------------------------------------------------------------------
|
#"""Version = 2018-03-06 17:00"""
|
#---------------------------------------------------------------------
|
|
import ChPyNetSendPack
|
import ChConfig
|
import GameWorld
|
import ItemControler
|
import NetPackCommon
|
import PlayerControl
|
import IpyGameDataPY
|
import PlayerTJG
|
|
import time
|
|
#//A5 06 Íæ¼ÒÁìÈ¡ÔÚÏß½±Àø #tagCMGetOnlinePrize
|
#
|
#struct tagCMGetOnlinePrize
|
#
|
#{
|
# tagHead Head;
|
# BYTE Index; // ½±ÀøË÷Òý,ÆäËû°´Ë³Ðò
|
# BYTE IsDaily; // ÊÇ·ñÁìȡÿÈÕÈÕ³£µÄ½±Àø£¬ÊÇ·¢1£¬Èç¹ûÁìÈ¡¶¨ÖÆ´´½ÇÌì½±ÀøµÄÔòĬÈÏ·¢0¼´¿É
|
#};
|
def GetOnlinePrize(index, clientPack, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
creatRoleDay = GameWorld.GetCreateRoleDays(curPlayer)
|
prizeIndex = clientPack.Index
|
if prizeIndex <= 0:
|
GameWorld.DebugLog("prizeIndexÐèÒª´Ó1¿ªÊ¼£¬ÎÒÒ²²»Ï룬±£ÁôÔÂß¼°É£¡£¡£¡")
|
return
|
ipyData = IpyGameDataPY.GetIpyGameDataNotLog('OnlineAwardNew', creatRoleDay)
|
if ipyData:
|
dayID = creatRoleDay
|
GameWorld.DebugLog("ÁìÈ¡´´½ÇÌìÔÚÏß½±Àø: creatRoleDay=%s,prizeIndex=%s" % (creatRoleDay, prizeIndex))
|
else:
|
dayID = 0
|
ipyData = IpyGameDataPY.GetIpyGameData('OnlineAwardNew', 0)
|
GameWorld.DebugLog("ÁìȡÿÌìÔÚÏß½±Àø: creatRoleDay=%s,prizeIndex=%s" % (creatRoleDay, prizeIndex))
|
|
if not ipyData:
|
return
|
#ÏȾÀÕýÒ»´Îʱ¼ä
|
onlineTime = GetOnlineTime(curPlayer)
|
|
#ÒÑÁì
|
awardInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OnlinePrizeNote)
|
awardMark = pow(2, prizeIndex - 1)
|
if awardInfo & awardMark:
|
#ÒÑÁìÈ¡
|
GameWorld.DebugLog("ÒÑÁìÈ¡½±Àø£¡dayID=%s,prizeIndex=%s" % (dayID, prizeIndex))
|
return
|
stageTimeList = ipyData.GetStageTime()
|
|
if prizeIndex - 1 >= len(stageTimeList):
|
GameWorld.DebugLog("²»´æÔÚ¸ÃÔÚÏß½±ÀøË÷Òý!")
|
return
|
needTime = stageTimeList[prizeIndex - 1]
|
if needTime * 60 > onlineTime:
|
GameWorld.DebugLog("ÔÚÏßʱ¼ä²»×㣡dayID=%s,prizeIndex=%s,needTime=%s" % (dayID, prizeIndex, needTime))
|
return
|
|
awardDict = ipyData.GetReward()
|
if str(prizeIndex) not in awardDict:
|
GameWorld.DebugLog("ûÓÐÅäÖøÃË÷Òý¶ÔÓ¦ÔÚÏß½±Àø!")
|
return
|
itemList = awardDict[str(prizeIndex)]
|
if not itemList:
|
return
|
updAwardNote = awardInfo | awardMark
|
GameWorld.DebugLog("ÔÚÏß½±Àø: %s, updAwardNote=%s" % (itemList, updAwardNote))
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnlinePrizeNote, updAwardNote)
|
ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["OnlinePrize", False, {}])
|
SendOnlinePrizeInfo(curPlayer)
|
return
|
|
def GetOnlineTime(curPlayer):
|
onlineTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayOnlineTime)
|
markTick = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OnlineStartTick)
|
if not markTick:
|
return onlineTime
|
curTime = int(time.time())
|
passTick = curTime - markTick
|
if passTick <= 0:
|
return onlineTime
|
return onlineTime + passTick
|
|
##ÀëÏ߸üмǼÔÚÏßʱ³¤
|
# @param notify ÊÇ·ñ֪ͨ¿Í»§¶Ë
|
# @return None
|
def CalcOnlineTime(curPlayer):
|
if PlayerTJG.GetIsTJG(curPlayer):
|
return 0
|
onlineTime = GetOnlineTime(curPlayer)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayOnlineTime, onlineTime)
|
SetStartCalcOnlineTick(curPlayer, 0)
|
GameWorld.DebugLog("¸üмǼÔÚÏßʱ³¤: %s" % onlineTime)
|
return onlineTime
|
|
|
##·¢Ëͽ±ÀøÐÅÏ¢°ü
|
# @param None
|
# @return None
|
def SendOnlinePrizeInfo(curPlayer):
|
dataCount = IpyGameDataPY.IPY_Data().GetOnlineAwardNewCount()
|
if not dataCount:
|
return
|
sendPack = ChPyNetSendPack.tagMCOnlinePrizeNew()
|
sendPack.Clear()
|
sendPack.OnlineTime = GetOnlineTime(curPlayer) * 1000
|
sendPack.PrizeInfo = [curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OnlinePrizeNote)] # ¹Ì¶¨Ö»·¢µ±ÌìµÄ
|
sendPack.Len = len(sendPack.PrizeInfo)
|
#֪ͨ¿Í»§¶Ëʱ¼ä
|
NetPackCommon.SendFakePack(curPlayer, sendPack)
|
return
|
|
|
##ÉèÖÿªÊ¼¼ÆÊ±Ê±¼ä
|
# @param None
|
# @return None
|
def SetStartCalcOnlineTick(curPlayer, newTime=-1):
|
if newTime == -1:
|
newTime=int(time.time())
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnlineStartTick, newTime)
|
return
|
|
## 怬
|
# @param curPlayer
|
# @return None
|
def OnPlayerLogin(curPlayer):
|
SetStartCalcOnlineTick(curPlayer)
|
SendOnlinePrizeInfo(curPlayer)
|
return
|
|
##ONDAYÖØÖÃ, ֪ͨ¿Í»§¶Ë
|
# @param None
|
# @return None
|
def ResetPrizeInfoOnDay(curPlayer):
|
__OnlineMailPrize(curPlayer)
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayOnlineTime, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnlinePrizeNote, 0) # ÖØÖÃÿÈÕÔÚÏß½±Àø
|
|
if PlayerTJG.GetIsTJG(curPlayer):
|
return
|
SetStartCalcOnlineTick(curPlayer)
|
|
SendOnlinePrizeInfo(curPlayer)
|
return
|
|
def __OnlineMailPrize(curPlayer):
|
#Óʼþ²¹·¢½±Àø
|
creatRoleDay = GameWorld.GetCreateRoleDays(curPlayer)
|
if creatRoleDay <= 1:
|
return
|
mailAwardDay = creatRoleDay - 1
|
ipyData = IpyGameDataPY.GetIpyGameDataNotLog('OnlineAwardNew', mailAwardDay)
|
if not ipyData:
|
ipyData = IpyGameDataPY.GetIpyGameDataNotLog('OnlineAwardNew', 0)
|
if not ipyData:
|
return
|
mailAwardDay = 0 # ×òÈշǶ¨ÖƵģ¬ÇÒÓÐÅäÖÃ0³£¹æµÄ£¬Ôò²¹·¢0µÄ
|
|
prizeInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OnlinePrizeNote)
|
onlineTime = GetOnlineTime(curPlayer)
|
needTimeList = ipyData.GetStageTime()
|
awardDict = ipyData.GetReward()
|
itemList = []
|
for i, needTime in enumerate(needTimeList):
|
if onlineTime >= needTime * 60 and not prizeInfo & pow(2, i):
|
for itemID, itemCnt in awardDict[str(i + 1)]:
|
itemList.append([itemID, itemCnt, 1])
|
prizeInfo|=pow(2, i)
|
|
if not itemList:
|
return
|
GameWorld.DebugLog('²¹·¢×òÈÕÔÚÏß½±Àø: mailAwardDay=%s,onlineTime=%s' % (mailAwardDay, onlineTime))
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnlinePrizeNote, prizeInfo)
|
PlayerControl.SendMailByKey('OnLineAward1', [curPlayer.GetID()], itemList)
|
return
|
|
|
|