e3c5cc5e
zhouhaihai
跨服竞技场over
|
1
|
skynet = require "skynet"
|
c779be0c
zhouhaihai
pvp 中心服务
|
2
|
local json = require("shared.json")
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
3
|
redisproxy = require("shared.redisproxy")
|
c779be0c
zhouhaihai
pvp 中心服务
|
4
|
local cluster = require "skynet.cluster"
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
5
6
7
|
local serverId = tonumber(skynet.getenv("servId"))
local sharedata = require "skynet.sharedata"
datacenter = require "skynet.datacenter"
|
c779be0c
zhouhaihai
pvp 中心服务
|
8
9
10
11
12
13
14
15
|
require "shared.init"
require "utils.init"
require "RedisKeys"
require "skynet.manager"
globalCsv = require "csvdata/GlobalDefine"
require "GlobalVar"
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
local MatchCache = {} -- 比赛记录 缓存 { [roundIdx] = {{rolesId, rolesId, winId = roleId}, {rolesId, rolesId}}, ... }
local RoleInfo = {} -- 角色信息缓存 {[rolesId] = info}
local pvpInfo = nil
local ROBOT_SERV_ID = 999
local function packRoleId(servId, roleId)
return roleId * 1000 + servId
end
local function unpackRoleId(tempId)
local servId = tempId % 1000
local roleId = math.floor(tempId / 1000)
return servId, roleId
end
|
c779be0c
zhouhaihai
pvp 中心服务
|
30
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
31
32
33
34
35
36
37
38
|
skynet.register_protocol {
name = "role",
id = 13,
pack = skynet.pack,
unpack = skynet.unpack,
dispatch = function(session, address, submethod, ...)
end,
}
|
c779be0c
zhouhaihai
pvp 中心服务
|
39
40
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
41
|
local function rpcRole(roleId, funcName, ...)
|
c779be0c
zhouhaihai
pvp 中心服务
|
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
local fields = ...
local agent = datacenter.get("agent", roleId)
if agent and agent.serv then
if funcName == "getProperties" then
return skynet.call(agent.serv, "role", funcName, fields)
else
return skynet.call(agent.serv, "role", funcName, ...)
end
else
local roleCross = require("models.RoleCross")
if funcName == "getProperties" then
return roleCross.handle(funcName, roleId, fields)
else
return roleCross.handle(funcName, roleId, ...)
end
end
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
60
61
62
63
64
65
|
local function getDBKey()
local resetData = csvdb["time_resetCsv"][TimeReset.PvpCross]
local curRound = math.floor((skynet.timex() - START_RESET_TIME - resetData.start) / resetData.interval)
local idx = 1
if curRound % 2 == 1 then
idx = 2
|
c779be0c
zhouhaihai
pvp 中心服务
|
66
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
67
68
69
70
71
72
73
74
75
|
return RANK_PVP_HIGHT_KEY[idx]
end
local function getStartTime()
local resetData = csvdb["time_resetCsv"][TimeReset.PvpCross]
local curRound = math.floor((skynet.timex() - START_RESET_TIME - resetData.start) / resetData.interval)
local startTime = START_RESET_TIME + curRound * resetData.interval + resetData.start
return startTime
|
c779be0c
zhouhaihai
pvp 中心服务
|
76
77
78
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
79
80
81
82
|
local CMD = {}
------------------- 角色调用 --------------------------
|
c779be0c
zhouhaihai
pvp 中心服务
|
83
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
84
85
86
87
88
89
90
|
function CMD.updateRoleInfo(change)
CMD.refreshRoleInfo(change)
local pvpd = cluster.query("center", "pvpd")
if pvpd then
pcall(cluster.call, "center", pvpd, "updateRoleInfo", change)
end
end
|
c779be0c
zhouhaihai
pvp 中心服务
|
91
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
92
93
|
local function getDayAndTime()
local startTime = getStartTime()
|
c779be0c
zhouhaihai
pvp 中心服务
|
94
|
local now = skynet.timex()
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
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
|
local crossTime = now - startTime
local aday = 3600 * 24
local day = math.ceil(crossTime / aday) -- 当前是第几个比赛日
local ctime = crossTime % aday -- 当前在本天 经过多少时间
return day, ctime
end
local function hideMatchInfo()
local day, ctime = getDayAndTime()
local tempMatchCache = {}
if day > globalCsv.pvp_cross_server_day then
return MatchCache
else
for round, tempData in pairs(MatchCache) do
if round == day and ctime < globalCsv.pvp_cross_server_show_result - 1 then
tempMatchCache[round] = {}
for idx, match in pairs(tempData) do
tempMatchCache[round][idx] = {
[1] = match[1],
[2] = match[2],
}
end
elseif round <= day then
tempMatchCache[round] = {}
for idx, match in pairs(tempData) do
tempMatchCache[round][idx] = {
[1] = match[1],
[2] = match[2],
win = match.win,
battleV = {
[match[1]] = (match.teams[match[1]] or {}).battleV,
[match[2]] = (match.teams[match[2]] or {}).battleV,
}
}
end
|
c779be0c
zhouhaihai
pvp 中心服务
|
132
133
134
|
end
end
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
135
|
return tempMatchCache
|
c779be0c
zhouhaihai
pvp 中心服务
|
136
137
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
138
139
140
141
142
143
144
145
146
147
148
149
150
|
local function hideRoleInfo()
local day, ctime = getDayAndTime()
local needInfo = {}
local tempRoleInfo = {}
for pId, roleInfo in pairs(RoleInfo) do
tempRoleInfo[pId] = {
name = roleInfo.name,
level = roleInfo.level,
headId = roleInfo.headId,
}
end
return tempRoleInfo
end
|
c779be0c
zhouhaihai
pvp 中心服务
|
151
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
152
153
154
155
156
157
158
159
160
|
function CMD.getMatchInfo()
if not next(MatchCache) then
local pvpd = cluster.query("center", "pvpd")
if pvpd then
local status, result = pcall(cluster.call, "center", pvpd, "getMatchInfo", {serverId = serverId})
MatchCache = result.matchInfo or {}
RoleInfo = result.roleInfo or {}
end
end
|
c779be0c
zhouhaihai
pvp 中心服务
|
161
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
162
|
return {matchInfo = hideMatchInfo(), roleInfo = hideRoleInfo()}
|
c779be0c
zhouhaihai
pvp 中心服务
|
163
164
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
165
166
167
|
function CMD.getRoleInfo()
if not next(MatchCache) then
CMD.getMatchInfo()
|
c779be0c
zhouhaihai
pvp 中心服务
|
168
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
|
return hideRoleInfo()
end
function CMD.getRoleDetail(pIds)
if not next(MatchCache) then
CMD.getMatchInfo()
end
local result = {}
for _, pId in ipairs(pIds) do
result[pId] = RoleInfo[pId]
end
return result
end
function CMD.getMatchRecord(round, matchIdx)
if not next(MatchCache) then
CMD.getMatchInfo()
end
local day, ctime = getDayAndTime()
if round > day or (round == day and ctime < globalCsv.pvp_cross_server_show_result) then return end -- 还么结算
if not (MatchCache[round] or {})[matchIdx] then return end
return {
videos = MatchCache[round][matchIdx].video,
teams = MatchCache[round][matchIdx].teams,
}
|
c779be0c
zhouhaihai
pvp 中心服务
|
194
195
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
|
function CMD.getBetInfo()
if not next(MatchCache) then
CMD.getMatchInfo()
end
local day, ctime = getDayAndTime()
local change = false
local lastDay = math.min(day, globalCsv.pvp_cross_server_day)
local betInfo = pvpInfo:getProperty("betInfo")
local betNum = pvpInfo:getProperty("betNum")
for cday = 1, lastDay do
if not betInfo[cday] then
change = true
betInfo[cday] = math.randomInt(1, #(MatchCache[cday] or {1}))
if cday == lastDay then
betNum = {}
end
end
end
if change then
pvpInfo:setProperties({
betInfo = betInfo,
betNum = betNum
})
end
return pvpInfo:getProperties({"betInfo", "betNum"})
end
function CMD.setBet(idx)
local day, ctime = getDayAndTime()
if day > globalCsv.pvp_cross_server_day or ctime >= globalCsv.pvp_cross_server_stop_stake then return end
local betInfo = pvpInfo:getProperty("betInfo")
if not betInfo[day] then return end
local betNum = pvpInfo:getProperty("betNum")
betNum[idx] = (betNum[idx] or 0) + 1
pvpInfo:setProperty("betNum", betNum)
return {betNum = betNum}
end
-------------------中心服务器 调用----------------------
function CMD.loadRoles(roleIds)
|
c779be0c
zhouhaihai
pvp 中心服务
|
240
241
|
roleIds = roleIds or {}
local infos = {}
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
242
|
RoleInfo[serverId] = RoleInfo[serverId] or {}
|
c779be0c
zhouhaihai
pvp 中心服务
|
243
244
|
for _, roleId in ipairs(roleIds) do
infos[roleId] = rpcRole(roleId, "pvpHInfo")
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
245
246
247
248
249
250
251
|
local temp = {}
for _field, _v in pairs(infos[roleId]) do
if _field ~= "battleInfo" then
temp[_field] = _v
end
end
RoleInfo[packRoleId(serverId, roleId)] = temp
|
c779be0c
zhouhaihai
pvp 中心服务
|
252
253
254
255
|
end
return infos
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
256
|
-- 新赛季了 清掉缓存
|
c779be0c
zhouhaihai
pvp 中心服务
|
257
258
259
260
261
262
263
|
function CMD.loadTeams()
local dbKey = getDBKey()
local redret = redisproxy:zrevrange(dbKey, 0, 15)
local roleIds = {}
for _, roleId in ipairs(redret) do
table.insert(roleIds, tonumber(roleId))
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
264
265
266
267
268
269
270
271
272
|
MatchCache = {}
RoleInfo = {}
local infos = CMD.loadRoles(roleIds)
pvpInfo:setProperties({
betInfo = {},
betNum = {},
})
return {roleIds = roleIds, infos = infos}
end
|
c779be0c
zhouhaihai
pvp 中心服务
|
273
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
274
275
276
277
278
|
-- 刷新缓存
function CMD.refreshMatchCache(info)
MatchCache = info.matchInfo
RoleInfo = info.roleInfo
end
|
c779be0c
zhouhaihai
pvp 中心服务
|
279
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
280
281
282
283
284
285
286
287
288
289
|
-- 刷新 玩家数据
function CMD.refreshRoleInfo(change)
if not next(RoleInfo) then return end
if RoleInfo[change.id] then
for field, value in pairs(change) do
if field ~= "id" then
RoleInfo[change.id][field] = value
end
end
end
|
c779be0c
zhouhaihai
pvp 中心服务
|
290
291
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
292
293
294
295
296
297
298
299
300
|
------------------------------------------------------
function CMD.start()
redisd = skynet.localname(".REDIS")
pvpInfo = require("models.Pvpd").new({key = "cross:pvpInfo"})
pvpInfo:load()
end
---------------------------------------------------------
|
c779be0c
zhouhaihai
pvp 中心服务
|
301
302
303
304
305
306
307
|
local function __init__()
skynet.dispatch("lua", function(_, _, command, ...)
local f = CMD[command]
if f then
skynet.ret(skynet.pack(f(...)))
end
end)
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
308
309
|
csvdb = sharedata.query("csvdata")
|
c779be0c
zhouhaihai
pvp 中心服务
|
310
311
312
313
|
skynet.register(".PVPCROSS")
end
skynet.start(__init__)
|