1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/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