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