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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Player.PlayerFuncSysPrivilege
#
# @todo:¹¦ÄÜÏµÍ³ÌØÈ¨½±Àø
# @author hxp
# @date 2021-04-13
# @version 1.0
#
# ÏêϸÃèÊö: ¹¦ÄÜÏµÍ³ÌØÈ¨½±Àø
#
#-------------------------------------------------------------------------------
#"""Version = 2021-04-13 16:00"""
#-------------------------------------------------------------------------------
 
import GameWorld
import IpyGameDataPY
import PlayerControl
import ItemControler
import ChPyNetSendPack
import NetPackCommon
import IPY_GameWorld
import ShareDefine
import ChConfig
 
import time
 
def OnPlayerLogin(curPlayer):
    Sync_FuncSysPrivilege(curPlayer)
    return
 
#// B2 11 ¼¤»î¹¦ÄÜÏµÍ³ÌØÈ¨½±Àø #tagCMActivateFuncSysPrivilege
#
#struct    tagCMActivateFuncSysPrivilege
#{
#    tagHead         Head;
#    BYTE        ActivateCount;    // ¼¤»î¸öÊý
#    BYTE        ActivateFuncSysIDList[ActivateCount];    // ¼¤»î¹¦ÄÜϵͳIDÁÐ±í£¬È«²¿¼¤»îÔòÐèÒª·¢ËùÓÐIDÁбí
#};
def OnActivateFuncSysPrivilege(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    activateFuncSysIDList = clientData.ActivateFuncSysIDList
    
    GameWorld.DebugLog("ÇëÇ󼤻ÄÜÏµÍ³ÌØÈ¨: %s" % activateFuncSysIDList)
    
    curTime = int(time.time())
    canActivateList = []
    for funcSysID in activateFuncSysIDList:
        ipyDatList = IpyGameDataPY.GetIpyGameDataList("FuncSysPrivilege", funcSysID)
        if not ipyDatList:
            continue
        
        actTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FuncSysPrivilegeActTime % funcSysID)
        if actTime:
            maxDays = len(ipyDatList)
            diffDays = GameWorld.GetDiff_Day(curTime, actTime)
            if diffDays < maxDays:
                GameWorld.DebugLog("    Î´³¬¹ý½±Àø×î´óÌ죬²»¿É¼¤»î: funcSysID=%s,diffDays(%s) < maxDays(%s)" % (funcSysID, diffDays, maxDays))
                continue
            
            isGetAll = True
            awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FuncSysPrivilegeAward % funcSysID)
            for ipyData in ipyDatList:
                dayNum = ipyData.GetDayNum()
                if not awardState & pow(2, dayNum):
                    isGetAll = False
                    GameWorld.DebugLog("    »¹ÓÐδÁìÈ¡µÄ½±Àø£¬²»¿É¼¤»î: funcSysID=%s,dayNum=%s" % (funcSysID, dayNum))
                    break
                
            if not isGetAll:
                continue
        canActivateList.append(funcSysID)
        
    GameWorld.DebugLog("    ¿É¼¤»îµÄ¹¦ÄÜÏµÍ³ÌØÈ¨: %s" % canActivateList)
    if not canActivateList:
        return
    
    needMoney = len(canActivateList) # ¿ªÍ¨1¸ö»¨·Ñ1
    infoDict = {ChConfig.Def_Cost_Reason_SonKey:canActivateList}
    if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_FuncSysPrivilege, needMoney, infoDict=infoDict):
        GameWorld.DebugLog("    »õ±Ò²»×ã! needMoney=%s" % needMoney)
        return
    
    for funcSysID in canActivateList:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FuncSysPrivilegeActTime % funcSysID, curTime)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FuncSysPrivilegeAward % funcSysID, 0)
        
    Sync_FuncSysPrivilege(curPlayer, canActivateList)
    return
 
#// B2 12 ÁìÈ¡¹¦ÄÜÏµÍ³ÌØÈ¨½±Àø #tagCMGetFuncSysPrivilegeAward
#
#struct    tagCMGetFuncSysPrivilegeAward
#{
#    tagHead         Head;
#    BYTE        FuncSysID;    // ¹¦ÄÜϵͳID
#    BYTE        DayNum;        // µÚXÌ죬1ΪµÚ1Ìì
#};
def OnGetFuncSysPrivilegeAward(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    funcSysID = clientData.FuncSysID
    dayNum = clientData.DayNum
    
    actTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FuncSysPrivilegeActTime % funcSysID)
    if not actTime:
        GameWorld.DebugLog("δ¼¤»î£¬²»¿ÉÁì½±£¡funcSysID=%s" % (funcSysID))
        return
    
    curTime = int(time.time())
    canGetMaxDayNum = GameWorld.GetDiff_Day(curTime, actTime) + 1
    if dayNum > canGetMaxDayNum:
        GameWorld.DebugLog("δ´ïµ½Áì½±Ì죬²»¿ÉÁì½±£¡funcSysID=%s,dayNum(%s) > canGetMaxDayNum(%s), actTime=%s" 
                           % (funcSysID, dayNum, canGetMaxDayNum, GameWorld.ChangeTimeNumToStr(actTime)))
        return
    
    awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FuncSysPrivilegeAward % funcSysID)
    if awardState & pow(2, dayNum):
        GameWorld.DebugLog("ÒÑÁìÈ¡¹ý¸ÃÌì½±Àø£¡funcSysID=%s,dayNum=%s,awardState=%s" % (funcSysID, dayNum, awardState))
        return
    
    ipyDatList = IpyGameDataPY.GetIpyGameDataList("FuncSysPrivilege", funcSysID)
    if not ipyDatList:
        return
    
    findIpyData = None
    for ipyData in ipyDatList:
        if ipyData.GetFuncSysID() == funcSysID and ipyData.GetDayNum() == dayNum:
            findIpyData = ipyData
            break
    if not findIpyData:
        GameWorld.DebugLog("ÕÒ²»µ½¸ÃÌì½±Àø£¡funcSysID=%s,dayNum=%s" % (funcSysID, dayNum))
        return
    
    awardItemList = findIpyData.GetDayAwardItemInfo()
    if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList):
        return
    
    updAwardState = awardState | pow(2, dayNum)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FuncSysPrivilegeAward % funcSysID, updAwardState)
    
    for itemID, itemCount, isAuctionItem in awardItemList:
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem], 
                                     event=["FuncSysPrivilegeAward", False, {}])
        
    Sync_FuncSysPrivilege(curPlayer, [funcSysID])
    return
 
def Sync_FuncSysPrivilege(curPlayer, syncIDList=None):
    if syncIDList == None:
        syncIDList = []
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        lastIpyData = ipyDataMgr.GetFuncSysPrivilegeByIndex(ipyDataMgr.GetFuncSysPrivilegeCount() - 1)
        maxFuncID = lastIpyData.GetFuncSysID()
        for funcSysID in xrange(1, maxFuncID + 1):
            if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FuncSysPrivilegeActTime % funcSysID):
                syncIDList.append(funcSysID)
        
        if not syncIDList:
            return
        
    clientPack = ChPyNetSendPack.tagMCFuncSysPrivilegeInfoList()
    clientPack.PrivilegeInfoList = []
    for funcSysID in syncIDList:
        info = ChPyNetSendPack.tagMCFuncSysPrivilegeInfo()
        info.FuncSysID = funcSysID
        info.ActivateTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FuncSysPrivilegeActTime % funcSysID)
        info.AwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FuncSysPrivilegeAward % funcSysID)
        
        clientPack.PrivilegeInfoList.append(info)
    clientPack.PrivilegeCount = len(clientPack.PrivilegeInfoList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return