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 
 | 
  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 优化
 | 
211 
 | 
  				redisproxy:del("cross:pvpInfo:bet:" .. cday)
 
 | 
e3c5cc5e
 
  zhouhaihai
 
跨服竞技场over
 | 
212
213
214
215
216
217
218
219
220
221
222
223
224 
 | 
  			end
  		end
  	end
  	if change then
  		pvpInfo:setProperties({
  			betInfo = betInfo,
  			betNum = betNum
  		})
  	end
  
  	return pvpInfo:getProperties({"betInfo", "betNum"})
  end
  
 
 | 
c581c6e9
 
  zhouhaihai
 
pvp 优化
 | 
225 
 | 
  function CMD.setBet(idx, roleId, costNum)
 
 | 
e3c5cc5e
 
  zhouhaihai
 
跨服竞技场over
 | 
226
227
228
229
230
231
232
233
234 
 | 
  	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 优化
 | 
235
236 
 | 
  
  	redisproxy:hset("cross:pvpInfo:bet:" .. day, roleId, costNum * 10 + idx)
 
 | 
e3c5cc5e
 
  zhouhaihai
 
跨服竞技场over
 | 
237
238
239
240
241
242 
 | 
  	return {betNum = betNum}
  end
  
  
  -------------------中心服务器 调用----------------------
  function CMD.loadRoles(roleIds)
 
 | 
c779be0c
 
  zhouhaihai
 
pvp 中心服务
 | 
243
244 
 | 
  	roleIds = roleIds or {}
  	local infos = {}
 
 | 
e3c5cc5e
 
  zhouhaihai
 
跨服竞技场over
 | 
245 
 | 
  	RoleInfo[serverId] = RoleInfo[serverId] or {}
 
 | 
c779be0c
 
  zhouhaihai
 
pvp 中心服务
 | 
246
247 
 | 
  	for _, roleId in ipairs(roleIds) do
  		infos[roleId] = rpcRole(roleId, "pvpHInfo")
 
 | 
e3c5cc5e
 
  zhouhaihai
 
跨服竞技场over
 | 
248
249
250
251
252
253
254 
 | 
  		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 中心服务
 | 
255
256
257
258 
 | 
  	end
  	return infos
  end
  
 
 | 
e3c5cc5e
 
  zhouhaihai
 
跨服竞技场over
 | 
259 
 | 
  -- 新赛季了 清掉缓存
 
 | 
c779be0c
 
  zhouhaihai
 
pvp 中心服务
 | 
260
261
262
263
264
265
266 
 | 
  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
 | 
267
268
269
270
271
272
273
274
275 
 | 
  	MatchCache = {}
  	RoleInfo = {}
  	local infos = CMD.loadRoles(roleIds)
  	pvpInfo:setProperties({
  		betInfo = {},
  		betNum = {},
  	})
  	return {roleIds = roleIds, infos = infos}
  end
 
 | 
c779be0c
 
  zhouhaihai
 
pvp 中心服务
 | 
276 
 | 
  
 
 | 
e3c5cc5e
 
  zhouhaihai
 
跨服竞技场over
 | 
277
278
279
280
281 
 | 
  -- 刷新缓存
  function CMD.refreshMatchCache(info)
  	MatchCache = info.matchInfo
  	RoleInfo = info.roleInfo
  end
 
 | 
c779be0c
 
  zhouhaihai
 
pvp 中心服务
 | 
282 
 | 
  
 
 | 
e3c5cc5e
 
  zhouhaihai
 
跨服竞技场over
 | 
283
284
285
286
287
288
289
290
291
292 
 | 
  -- 刷新 玩家数据
  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 中心服务
 | 
293
294 
 | 
  end
  
 
 | 
e3c5cc5e
 
  zhouhaihai
 
跨服竞技场over
 | 
295
296
297
298
299
300
301
302
303 
 | 
  ------------------------------------------------------
  function CMD.start()
  	redisd = skynet.localname(".REDIS")
  	pvpInfo = require("models.Pvpd").new({key = "cross:pvpInfo"})
  	pvpInfo:load()
  end
  
  ---------------------------------------------------------
  
 
 | 
c779be0c
 
  zhouhaihai
 
pvp 中心服务
 | 
304
305
306
307
308
309
310 
 | 
  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
 | 
311
312 
 | 
  	csvdb = sharedata.query("csvdata")
  	
 
 | 
c779be0c
 
  zhouhaihai
 
pvp 中心服务
 | 
313
314
315
316 
 | 
  	skynet.register(".PVPCROSS")
  end
  
  skynet.start(__init__)
 
 |