#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#
|
#
|
##@package GameWorldAverageLv.py
|
#
|
# @todo:ÊÀ½çµÈ¼¶
|
#
|
# @author zhangxi
|
# @date 2012-07-06
|
# @version 1.5
|
# @note:
|
# @change: "2012-07-09 15:40" zhangxi ÐÞ¸ÄÅäÖñí¶ÁÈ¡
|
# @change: "2012-07-17 14:30" zhangxi ÐÞ¸ÄÅÅÐаñΪ¿ÕʱµÄÅжÏ
|
# @change: "2012-07-19 19:30" zhangxi ÐÞ¸´µÚ9Ìì²Å¿ªÆô
|
# @change: "2012-12-03 10:00" wdb ¿ç·þ·þÎñÆ÷¹¦ÄÜÏÞÖÆ
|
# @change: "2015-02-02 12:00" hxp ÊÀ½çµÈ¼¶¼ÆËãȡֵÐÞ¸Ä(µÈ¼¶°ñ´æÖµ±ä¸ü)
|
#------------------------------------------------------------------------------------------------------------
|
"""Version = 2015-02-02 12:00"""
|
#------------------------------------------------------------------------------
|
import GameWorld
|
import ShareDefine
|
import PlayerDBGSEvent
|
import ChConfig
|
import IpyGameDataPY
|
|
import datetime
|
#------------------------------------------------------------------------------
|
|
|
## ¿ªÆôÊÀ½çµÈ¼¶
|
# @param None:
|
# @return: None
|
def OpenWorldAverageLv():
|
if not __IsWorldAverageLv():
|
return
|
|
beforeLv = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
|
|
#ÉèÖÃÊÀ½çµÈ¼¶
|
worldAverageLv = __GetWorldAverageLv(beforeLv)
|
if worldAverageLv != beforeLv:
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv, worldAverageLv)
|
|
#֪ͨµØÍ¼·þÎñÆ÷µ±Ç°ÊÀ½çµÈ¼¶
|
if GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv) != worldAverageLv:
|
GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_WorldAverageLv, worldAverageLv)
|
GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_WorldAverageLv, worldAverageLv)
|
|
GameWorld.Log("WorldAverageLv Change:beforeLv = %s, curLv = %s"%(beforeLv, worldAverageLv))
|
return
|
|
|
## ÊÇ·ñ¿ªÆôÊÀ½çµÈ¼¶
|
# @param None:
|
# @return:
|
def __IsWorldAverageLv():
|
# ¿ç·þ·þÎñÆ÷¹¦ÄÜÏÞÖÆ
|
if GameWorld.IsCrossServer():
|
return
|
return True
|
|
|
## »ñÈ¡ÊÀ½çµÈ¼¶
|
# @param None:
|
# @return:
|
def __GetWorldAverageLv(beforeLv):
|
worldLV = 0
|
initOpenServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)
|
if initOpenServerTime <= 0:
|
return beforeLv
|
diffSecond = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_WorldLVExtraTime) #¶îÍâʱ¼ä²ÎÊý
|
initOpenServerTime = GameWorld.ChangeTimeNumToDatetime(initOpenServerTime, ChConfig.TYPE_Time_Format)
|
openServerSecond = max(0, GameWorld.GetPastSeconds(str(initOpenServerTime)) + diffSecond)
|
maxCnt = IpyGameDataPY.IPY_Data().GetWorldLVCount()
|
GameWorld.Log("¼ÆËãÊÀ½çµÈ¼¶: diffSecond=%s,initOpenServerTime=%s,openServerSecond=%s,maxCnt=%s"
|
% (diffSecond, initOpenServerTime, openServerSecond, maxCnt))
|
for i in xrange(maxCnt):
|
curIpyData = IpyGameDataPY.IPY_Data().GetWorldLVByIndex(i)
|
if i == maxCnt - 1:
|
worldLV = curIpyData.GetWorldLV()
|
else:
|
nextIpyData = IpyGameDataPY.IPY_Data().GetWorldLVByIndex(i+1)
|
if curIpyData.GetOpenServerSecond() <= openServerSecond < nextIpyData.GetOpenServerSecond():
|
worldLV = curIpyData.GetWorldLV()
|
GameWorld.Log(" i=%s,worldLV=%s" % (i, worldLV))
|
break
|
if openServerSecond < curIpyData.GetOpenServerSecond():
|
#·Àֹʱ¼äÍù»Øµ÷µÄÇé¿ö£¬µ¼ÖÂÊÀ½çµÈ¼¶Òì³£
|
worldLV = beforeLv
|
GameWorld.Log(" i=%s,worldLV=%s,beforeLv=%s" % (i, worldLV, beforeLv))
|
break
|
|
playerAvgLV = 0
|
billBoard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_LV)
|
needPlayerCount = IpyGameDataPY.GetFuncCfg("WorldAverageLv", 1)
|
if billBoard and needPlayerCount:
|
totalLV = 0
|
playerCount = 0
|
for index in xrange(billBoard.GetCount()):
|
boardData = billBoard.At(index)
|
if not boardData:
|
continue
|
playerCount += 1
|
totalLV += boardData.GetCmpValue()
|
if playerCount >= needPlayerCount:
|
break
|
if totalLV > 0 and playerCount > 0:
|
playerAvgLV = int(totalLV / float(playerCount))
|
GameWorld.Log(" playerAvgLV=%s" % playerAvgLV)
|
|
worldAvgLV = int(eval(IpyGameDataPY.GetFuncCompileCfg("WorldAverageLv", 2)))
|
if worldAvgLV < worldLV:
|
worldAvgLV = worldLV
|
GameWorld.Log(" worldAvgLV=%s" % worldAvgLV)
|
return worldAvgLV
|
|
def GetWorldLVListByTime(startTime, day=1):
|
##¸ù¾Ýʱ¼ä¼ÆËã¶à¸öÊÀ½çµÈ¼¶
|
initOpenServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)
|
if initOpenServerTime <= 0:
|
return []
|
worldlvList = []
|
diffSecond = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_WorldLVExtraTime) #¶îÍâʱ¼ä²ÎÊý
|
initOpenServerTime = GameWorld.ChangeTimeNumToDatetime(initOpenServerTime, ChConfig.TYPE_Time_Format)
|
if startTime < initOpenServerTime:
|
return []
|
ipyMgr = IpyGameDataPY.IPY_Data()
|
for dayIndex in xrange(day):
|
nextTime = startTime + datetime.timedelta(days=dayIndex)
|
pastTimeDelta = nextTime - initOpenServerTime
|
pastSeconds = max(0, pastTimeDelta.days * 24 * 60 * 60 + pastTimeDelta.seconds + diffSecond)
|
maxCnt = ipyMgr.GetWorldLVCount()
|
worldLV = 0
|
for i in xrange(maxCnt):
|
curIpyData = ipyMgr.GetWorldLVByIndex(i)
|
if i == maxCnt - 1:
|
worldLV = curIpyData.GetWorldLV()
|
else:
|
nextIpyData = ipyMgr.GetWorldLVByIndex(i+1)
|
if curIpyData.GetOpenServerSecond() <= pastSeconds < nextIpyData.GetOpenServerSecond():
|
worldLV = curIpyData.GetWorldLV()
|
break
|
worldlvList.append(worldLV)
|
|
GameWorld.DebugLog(' GetWorldLVByTime startTime=%s,day=%s,worldlvList=%s'%(str(startTime), day, worldlvList))
|
return worldlvList
|