#!/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 IPY_GameWorld
|
import ItemCommon
|
import NetPackCommon
|
import PlayerControl
|
import IpyGameDataPY
|
import PlayerTJG
|
|
import time
|
|
##ÁìÈ¡ÔÚÏß½±Àø
|
# @param None
|
# @return None
|
def GetOnlinePrize(index, clientPack, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
creatRoleDay = GameWorld.GetCreateRoleDays(curPlayer)#GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
|
dayID = creatRoleDay
|
prizeIndex = clientPack.Index
|
if not __GetOnlineIsOpen(curPlayer):
|
return
|
ipyData = IpyGameDataPY.GetIpyGameData('OnlineAward', dayID)
|
if not ipyData:
|
return
|
#ÏȾÀÕýÒ»´Îʱ¼ä
|
onlineTime = GetOnlineTime(curPlayer)
|
|
#ÒÑÁì
|
awardInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OnlinePrizeNote % dayID)
|
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):
|
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:
|
return
|
itemList = awardDict[str(prizeIndex)]
|
|
# ¼ì²é±³°ü
|
needSpace = len(itemList)
|
packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
|
if needSpace > packSpace:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
|
return
|
|
|
# ¸øÎïÆ·
|
for itemID, itemCount in itemList:
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem])
|
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnlinePrizeNote % dayID, awardInfo | awardMark)
|
|
#·¢°ü
|
SendOnlinePrizeInfo(curPlayer)
|
return
|
|
|
##²éѯÔÚÏß½±Àø
|
# @param None
|
# @return None
|
def QueryOnlinePrize(index, clientPack, tick):
|
# curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
# # ¼ÆËãʱ³¤
|
# CalcOnlineTime(curPlayer, tick, True)
|
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
|
onlineTime = GetOnlineTime(curPlayer)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayOnlineTime, onlineTime)
|
SetStartCalcOnlineTick(curPlayer, 0)
|
return
|
|
def __GetOnlineIsOpen(curPlayer):
|
dayCnt = IpyGameDataPY.IPY_Data().GetOnlineAwardCount()
|
creatRoleDay = GameWorld.GetCreateRoleDays(curPlayer)#GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
|
return creatRoleDay <= dayCnt
|
|
|
##·¢Ëͽ±ÀøÐÅÏ¢°ü
|
# @param None
|
# @return None
|
def SendOnlinePrizeInfo(curPlayer):
|
if not __GetOnlineIsOpen(curPlayer):
|
return
|
sendPack = ChPyNetSendPack.tagMCOnlinePrize()
|
sendPack.Clear()
|
sendPack.OnlineTime = GetOnlineTime(curPlayer) * 1000#curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayOnlineTime)
|
sendPack.PrizeInfo = []
|
for i in xrange(IpyGameDataPY.IPY_Data().GetOnlineAwardCount()):
|
dayID = i+1
|
sendPack.PrizeInfo.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OnlinePrizeNote % dayID))
|
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)
|
|
if PlayerTJG.GetIsTJG(curPlayer):
|
return
|
SetStartCalcOnlineTick(curPlayer)
|
|
SendOnlinePrizeInfo(curPlayer)
|
return
|
|
|
|
def __OnlineMailPrize(curPlayer):
|
#Óʼþ²¹·¢½±Àø
|
creatRoleDay = GameWorld.GetCreateRoleDays(curPlayer)-1#GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
|
if not creatRoleDay:
|
return
|
|
ipyData = IpyGameDataPY.GetIpyGameDataNotLog('OnlineAward', creatRoleDay)
|
if not ipyData:
|
return
|
prizeInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OnlinePrizeNote % creatRoleDay)
|
onlineTime = GetOnlineTime(curPlayer)
|
GameWorld.DebugLog('creatRoleDay=%s,onlineTime=%s' % (creatRoleDay, onlineTime))
|
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
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnlinePrizeNote % creatRoleDay, prizeInfo)
|
PlayerControl.SendMailByKey('OnLineAward1', [curPlayer.GetID()], itemList)
|
return
|
|
|
|