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
|
local serverId = tonumber(skynet.getenv("servId"))
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
6
|
datacenter = require "skynet.datacenter"
|
a5486ede
zhouhaihai
csvdata 修改为 share...
|
7
|
csvdb = require "shared.csvdata"
|
c779be0c
zhouhaihai
pvp 中心服务
|
8
9
10
11
|
require "shared.init"
require "utils.init"
require "RedisKeys"
require "skynet.manager"
|
c779be0c
zhouhaihai
pvp 中心服务
|
12
13
14
|
require "GlobalVar"
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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 中心服务
|
29
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
30
31
|
skynet.register_protocol {
name = "role",
|
a5486ede
zhouhaihai
csvdata 修改为 share...
|
32
|
id = 101,
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
33
34
35
36
37
|
pack = skynet.pack,
unpack = skynet.unpack,
dispatch = function(session, address, submethod, ...)
end,
}
|
c779be0c
zhouhaihai
pvp 中心服务
|
38
39
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
40
|
local function rpcRole(roleId, funcName, ...)
|
c779be0c
zhouhaihai
pvp 中心服务
|
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
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
|
59
60
61
62
63
64
|
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 中心服务
|
65
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
66
67
68
69
70
71
72
73
74
|
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 中心服务
|
75
76
77
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
78
79
80
81
|
local CMD = {}
------------------- 角色调用 --------------------------
|
c779be0c
zhouhaihai
pvp 中心服务
|
82
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
83
84
85
86
|
function CMD.updateRoleInfo(change)
CMD.refreshRoleInfo(change)
local pvpd = cluster.query("center", "pvpd")
if pvpd then
|
69a45034
zhouhaihai
跨服竞技场
|
87
|
pcall(cluster.send, "center", pvpd, "updateRoleInfo", change)
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
88
89
|
end
end
|
c779be0c
zhouhaihai
pvp 中心服务
|
90
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
91
92
|
local function getDayAndTime()
local startTime = getStartTime()
|
c779be0c
zhouhaihai
pvp 中心服务
|
93
|
local now = skynet.timex()
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
94
|
|
69a45034
zhouhaihai
跨服竞技场
|
95
|
local crossTime = now - startTime + RESET_TIME * 3600
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
96
97
98
99
100
101
102
103
104
105
|
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 = {}
|
fef12fca
zhouhaihai
battlev
|
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
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,
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
125
|
}
|
fef12fca
zhouhaihai
battlev
|
126
|
}
|
c779be0c
zhouhaihai
pvp 中心服务
|
127
128
129
|
end
end
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
130
|
return tempMatchCache
|
c779be0c
zhouhaihai
pvp 中心服务
|
131
132
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
133
134
135
136
137
138
139
140
141
142
143
144
145
|
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 中心服务
|
146
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
147
148
149
150
151
152
153
154
155
|
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 中心服务
|
156
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
157
|
return {matchInfo = hideMatchInfo(), roleInfo = hideRoleInfo()}
|
c779be0c
zhouhaihai
pvp 中心服务
|
158
159
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
160
161
162
|
function CMD.getRoleInfo()
if not next(MatchCache) then
CMD.getMatchInfo()
|
c779be0c
zhouhaihai
pvp 中心服务
|
163
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
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 中心服务
|
189
190
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
|
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 = {}
|
c581c6e9
zhouhaihai
pvp 优化
|
206
|
redisproxy:del("cross:pvpInfo:bet:" .. cday)
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
207
208
209
210
211
212
213
214
215
216
217
218
219
|
end
end
end
if change then
pvpInfo:setProperties({
betInfo = betInfo,
betNum = betNum
})
end
return pvpInfo:getProperties({"betInfo", "betNum"})
end
|
c581c6e9
zhouhaihai
pvp 优化
|
220
|
function CMD.setBet(idx, roleId, costNum)
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
221
222
223
224
225
226
227
228
229
|
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)
|
c581c6e9
zhouhaihai
pvp 优化
|
230
231
|
redisproxy:hset("cross:pvpInfo:bet:" .. day, roleId, costNum * 10 + idx)
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
232
233
234
235
236
237
|
return {betNum = betNum}
end
-------------------中心服务器 调用----------------------
function CMD.loadRoles(roleIds)
|
c779be0c
zhouhaihai
pvp 中心服务
|
238
239
|
roleIds = roleIds or {}
local infos = {}
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
240
|
RoleInfo[serverId] = RoleInfo[serverId] or {}
|
c779be0c
zhouhaihai
pvp 中心服务
|
241
242
|
for _, roleId in ipairs(roleIds) do
infos[roleId] = rpcRole(roleId, "pvpHInfo")
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
243
244
245
246
247
248
249
|
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 中心服务
|
250
251
252
253
|
end
return infos
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
254
|
-- 新赛季了 清掉缓存
|
c779be0c
zhouhaihai
pvp 中心服务
|
255
256
257
258
259
260
261
|
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
|
262
263
264
265
266
267
268
269
270
|
MatchCache = {}
RoleInfo = {}
local infos = CMD.loadRoles(roleIds)
pvpInfo:setProperties({
betInfo = {},
betNum = {},
})
return {roleIds = roleIds, infos = infos}
end
|
c779be0c
zhouhaihai
pvp 中心服务
|
271
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
272
273
274
275
276
|
-- 刷新缓存
function CMD.refreshMatchCache(info)
MatchCache = info.matchInfo
RoleInfo = info.roleInfo
end
|
c779be0c
zhouhaihai
pvp 中心服务
|
277
|
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
278
279
280
281
282
283
284
285
286
287
|
-- 刷新 玩家数据
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 中心服务
|
288
289
|
end
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
290
291
|
------------------------------------------------------
function CMD.start()
|
a5486ede
zhouhaihai
csvdata 修改为 share...
|
292
293
|
globalCsv = csvdb["GlobalDefineCsv"]
|
e3c5cc5e
zhouhaihai
跨服竞技场over
|
294
295
296
297
298
299
|
pvpInfo = require("models.Pvpd").new({key = "cross:pvpInfo"})
pvpInfo:load()
end
---------------------------------------------------------
|
c779be0c
zhouhaihai
pvp 中心服务
|
300
301
302
303
304
305
306
|
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
|
307
|
|
a5486ede
zhouhaihai
csvdata 修改为 share...
|
308
|
skynet.register(".pvpcross")
|
c779be0c
zhouhaihai
pvp 中心服务
|
309
310
311
|
end
skynet.start(__init__)
|