440aa055
zhouhaihai
聊天
|
1
2
3
4
5
|
local ipairs = ipairs
local table = table
local math = math
local redisproxy = redisproxy
local MsgPack = MsgPack
|
4cf74232
zhouhaihai
pvp
|
6
7
|
local httpc = require("http.httpc")
local remoteUrl = skynet.getenv("codeurl")
|
440aa055
zhouhaihai
聊天
|
8
9
10
|
local _M = {}
|
4cf74232
zhouhaihai
pvp
|
11
12
|
local _pvpBattleInfoCacheC = {} --查询列表 缓存pvp战斗相关数据缓存
local _pvpStartBattleCache = nil --
|
440aa055
zhouhaihai
聊天
|
13
|
|
4cf74232
zhouhaihai
pvp
|
14
15
|
local _pvpRecordInfoCache = {} -- 记录缓存
local _pvpRecordBattleInfoCache = {} -- 记录战斗数据缓存
|
f317b790
zhouhaihai
pvp 遗留
|
16
17
|
local _revengeRecord = {} -- 复仇对单人1分钟间隔
local RevengeWaitTime = 60
|
440aa055
zhouhaihai
聊天
|
18
19
20
|
function _M.formatCommonRpc(agent , data)
local role = agent.role
|
fa565e0c
zhouhaihai
优化结构
|
21
|
local roleId = role:getProperty("id")
|
440aa055
zhouhaihai
聊天
|
22
|
local msg = MsgPack.unpack(data)
|
fa565e0c
zhouhaihai
优化结构
|
23
|
local pvpTC = role:getProperty("pvpTC")
|
3dbbc9f3
zhouhaihai
加上新的任务
|
24
|
for slot, heroId in pairs(msg.heros or {}) do
|
440aa055
zhouhaihai
聊天
|
25
26
27
28
|
if not role.heros[heroId] then
return
end
end
|
3dbbc9f3
zhouhaihai
加上新的任务
|
29
|
if not msg.heros or not next(msg.heros) then
|
fa565e0c
zhouhaihai
优化结构
|
30
|
return
|
440aa055
zhouhaihai
聊天
|
31
|
end
|
440aa055
zhouhaihai
聊天
|
32
|
|
fa565e0c
zhouhaihai
优化结构
|
33
34
35
36
37
38
39
40
|
table.clear(pvpTC)
pvpTC.heros = {}
for slot, heroId in pairs(msg.heros) do
pvpTC.heros[slot] = heroId
end
pvpTC.leader = msg.leader
role:savePvpCTeam(pvpTC)
|
440aa055
zhouhaihai
聊天
|
41
42
43
44
|
SendPacket(actionCodes.Pvp_formatCommonRpc, '')
return true
end
|
4cf74232
zhouhaihai
pvp
|
45
|
|
3dbbc9f3
zhouhaihai
加上新的任务
|
46
|
local function getMatchInfo(role, pvpList, battleCache)
|
4cf74232
zhouhaihai
pvp
|
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
table.clear(battleCache)
local redret = redisproxy:pipelining(function(red)
for _, info in ipairs(pvpList) do
if info.t == 1 then
red:zscore(RANK_PVP_COMMON, info.id)
end
end
end)
local matches = {}
local curIdx = 1
for idx, info in ipairs(pvpList) do
local curInfo = {idx = idx}
if info.t == 1 then --玩家
curInfo.roleId = info.id
|
3dbbc9f3
zhouhaihai
加上新的任务
|
62
|
curInfo.score = role:unpackPvpScore(redret[curIdx] or 0)
|
4cf74232
zhouhaihai
pvp
|
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
curIdx = curIdx + 1
-- name, level, headId, battleV, heros
local online, roleInfo = rpcRole(curInfo.roleId, "pvpCInfo")
for k , v in pairs(roleInfo) do
if k == "battleInfo" then
battleCache[curInfo.roleId] = v
else
curInfo[k] = v
end
end
elseif info.t == 2 then -- robot
curInfo.robot = info.id
end
table.insert(matches, curInfo)
end
return matches
end
-- 获取pvp信息
function _M.infoRpc(agent, data)
|
440aa055
zhouhaihai
聊天
|
83
|
local role = agent.role
|
4cf74232
zhouhaihai
pvp
|
84
|
local roleId = role:getProperty("id")
|
440aa055
zhouhaihai
聊天
|
85
|
local msg = MsgPack.unpack(data)
|
4cf74232
zhouhaihai
pvp
|
86
|
local ptype = msg.ptype or 1
|
440aa055
zhouhaihai
聊天
|
87
|
|
4cf74232
zhouhaihai
pvp
|
88
89
90
91
92
93
|
local response = {}
if ptype == 1 then -- 普通pvp
local redret = redisproxy:pipelining(function(red)
red:zscore(RANK_PVP_COMMON, roleId)
red:zrevrank(RANK_PVP_COMMON, roleId)
end)
|
3dbbc9f3
zhouhaihai
加上新的任务
|
94
|
local score = role:unpackPvpScore(redret[1] or 0)
|
4cf74232
zhouhaihai
pvp
|
95
|
local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp
|
b115474f
zhouhaihai
默认积分 1000
|
96
97
98
|
if rank == -1 then
score = globalCsv.pvp_base_score
end
|
4cf74232
zhouhaihai
pvp
|
99
100
101
102
103
104
105
|
local pvpMC = role:getProperty("pvpMC")
if not next(pvpMC) then --没有分配过对手
role:refreshPvpMatchC(score)
pvpMC = role:getProperty("pvpMC")
end
if not next(pvpMC) then return end
|
4cf74232
zhouhaihai
pvp
|
106
|
response.rank = rank
|
b115474f
zhouhaihai
默认积分 1000
|
107
|
response.score = score
|
3dbbc9f3
zhouhaihai
加上新的任务
|
108
|
response.matches = getMatchInfo(role, pvpMC, _pvpBattleInfoCacheC)
|
440aa055
zhouhaihai
聊天
|
109
|
|
4cf74232
zhouhaihai
pvp
|
110
111
112
113
114
115
|
elseif ptype == 2 then -- 高级pvp
return
else
return
end
SendPacket(actionCodes.Pvp_infoRpc, MsgPack.pack(response))
|
440aa055
zhouhaihai
聊天
|
116
117
118
|
return true
end
|
4cf74232
zhouhaihai
pvp
|
119
|
function _M.refreshMatchCRpc(agent, data)
|
440aa055
zhouhaihai
聊天
|
120
121
|
local role = agent.role
local msg = MsgPack.unpack(data)
|
4cf74232
zhouhaihai
pvp
|
122
123
124
|
role:refreshPvpMatchC()
local pvpMC = role:getProperty("pvpMC")
|
3dbbc9f3
zhouhaihai
加上新的任务
|
125
|
local matches = getMatchInfo(role, pvpMC, _pvpBattleInfoCacheC)
|
440aa055
zhouhaihai
聊天
|
126
|
|
4cf74232
zhouhaihai
pvp
|
127
|
SendPacket(actionCodes.Pvp_refreshMatchCRpc, MsgPack.pack({matches = matches}))
|
440aa055
zhouhaihai
聊天
|
128
129
130
131
132
133
|
return true
end
function _M.buyCountRpc(agent, data)
local role = agent.role
local msg = MsgPack.unpack(data)
|
4cf74232
zhouhaihai
pvp
|
134
|
local count = msg.count
|
440aa055
zhouhaihai
聊天
|
135
|
|
4cf74232
zhouhaihai
pvp
|
136
137
138
139
140
141
142
143
|
if math.illegalNum(count, 1, math.huge) then
return 1
end
local cost = {[ItemId.Diamond] = globalCsv.pvp_buy_cost * count}
if not role:checkItemEnough(cost) then return 2 end
role:costItems(cost)
role:award({[ItemId.PvpKey] = count})
|
440aa055
zhouhaihai
聊天
|
144
145
146
147
148
149
|
SendPacket(actionCodes.Pvp_buyCountRpc, '')
return true
end
function _M.startBattleRpc(agent, data)
|
4cf74232
zhouhaihai
pvp
|
150
151
|
local role = agent.role
local msg = MsgPack.unpack(data)
|
440aa055
zhouhaihai
聊天
|
152
|
|
4cf74232
zhouhaihai
pvp
|
153
154
155
|
local idx = msg.idx
local revenge = msg.revenge
|
3dbbc9f3
zhouhaihai
加上新的任务
|
156
157
158
|
local pvpTC = role:getProperty("pvpTC")
if not pvpTC.heros or not next(pvpTC.heros) then return 1 end
|
85083dba
zhouhaihai
拉黑从申请列表移除
|
159
|
local matchInfo, result, key, wait
|
3dbbc9f3
zhouhaihai
加上新的任务
|
160
|
|
85083dba
zhouhaihai
拉黑从申请列表移除
|
161
|
local now = skynet.timex()
|
4cf74232
zhouhaihai
pvp
|
162
|
if revenge then --复仇
|
85083dba
zhouhaihai
拉黑从申请列表移除
|
163
|
local temp = _pvpRecordInfoCache[idx]
|
3dbbc9f3
zhouhaihai
加上新的任务
|
164
|
if not temp then return 2 end
|
85083dba
zhouhaihai
拉黑从申请列表移除
|
165
|
|
f317b790
zhouhaihai
pvp 遗留
|
166
|
if not _revengeRecord[temp.id] or now >= _revengeRecord[temp.id] then
|
85083dba
zhouhaihai
拉黑从申请列表移除
|
167
168
169
170
171
172
173
|
if temp.t == 1 then
matchInfo = _pvpRecordBattleInfoCache[temp.id]
elseif temp.t == 2 then
matchInfo = {robot = temp.id}
end
else
result = 1
|
f317b790
zhouhaihai
pvp 遗留
|
174
|
wait = _revengeRecord[temp.id] - now
|
4cf74232
zhouhaihai
pvp
|
175
176
177
|
end
else --打正常
local pvpMC = role:getProperty("pvpMC")
|
3dbbc9f3
zhouhaihai
加上新的任务
|
178
|
if not pvpMC[idx] then return 3 end
|
4cf74232
zhouhaihai
pvp
|
179
180
181
182
183
184
185
|
if pvpMC[idx].t == 1 then
matchInfo = _pvpBattleInfoCacheC[pvpMC[idx].id]
elseif pvpMC[idx].t == 2 then
matchInfo = {robot = pvpMC[idx].id}
end
end
|
3dbbc9f3
zhouhaihai
加上新的任务
|
186
|
if not result and not matchInfo then return 4 end
|
85083dba
zhouhaihai
拉黑从申请列表移除
|
187
188
189
190
191
192
|
if not result then
-- 次数扣一波
local pvpFree = role.dailyData:getProperty("pvpFree")
if pvpFree >= globalCsv.pvp_battle_free_count then
local cost = {[ItemId.PvpKey] = 1}
|
3dbbc9f3
zhouhaihai
加上新的任务
|
193
|
if not role:checkItemEnough(cost) then return 5 end
|
85083dba
zhouhaihai
拉黑从申请列表移除
|
194
195
196
197
|
role:costItems(cost)
else
role.dailyData:updateProperty({field = "pvpFree", delta = 1})
end
|
4cf74232
zhouhaihai
pvp
|
198
|
|
85083dba
zhouhaihai
拉黑从申请列表移除
|
199
200
|
key = tostring(math.random())
_pvpStartBattleCache = {idx = idx, key = key, revenge = revenge}
|
3dbbc9f3
zhouhaihai
加上新的任务
|
201
202
|
role:checkTaskEnter("PvpBattle")
|
4cf74232
zhouhaihai
pvp
|
203
204
|
end
|
85083dba
zhouhaihai
拉黑从申请列表移除
|
205
|
SendPacket(actionCodes.Pvp_startBattleRpc, MsgPack.pack({matchInfo = matchInfo, key = key, result = result, wait = wait}))
|
4cf74232
zhouhaihai
pvp
|
206
|
return true
|
440aa055
zhouhaihai
聊天
|
207
208
209
|
end
function _M.endBattleRpc(agent, data)
|
4cf74232
zhouhaihai
pvp
|
210
211
212
|
local role = agent.role
local roleId = role:getProperty("id")
local msg = MsgPack.unpack(data)
|
440aa055
zhouhaihai
聊天
|
213
|
|
4cf74232
zhouhaihai
pvp
|
214
215
216
|
if not msg.key or not _pvpStartBattleCache or msg.key ~= _pvpStartBattleCache.key then
return 1
end
|
3dbbc9f3
zhouhaihai
加上新的任务
|
217
218
|
if not msg.idx or msg.idx ~= _pvpStartBattleCache.idx then
|
4cf74232
zhouhaihai
pvp
|
219
220
|
return 2
end
|
440aa055
zhouhaihai
聊天
|
221
|
|
4cf74232
zhouhaihai
pvp
|
222
|
local isWin = msg.starNum and msg.starNum > 0
|
85083dba
zhouhaihai
拉黑从申请列表移除
|
223
|
local now = skynet.timex()
|
4cf74232
zhouhaihai
pvp
|
224
225
226
227
228
|
local revenge = _pvpStartBattleCache.revenge
local match
if revenge then
match = _pvpRecordInfoCache[msg.idx]
|
f317b790
zhouhaihai
pvp 遗留
|
229
|
_revengeRecord[match.id] = now + RevengeWaitTime -- 1分钟内不能再打
|
4cf74232
zhouhaihai
pvp
|
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
|
else
local pvpMC = role:getProperty("pvpMC")
match = pvpMC[msg.idx]
end
if not match then return end
local temp = string.randWeight(csvdb["player_expCsv"][role:getProperty("level")].pvpBonus, true)
local reward = role:award({[temp[1]] = temp[2]})
local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = role:changePvpScoreCommon(match.t == 1 and match.id or -1, isWin)
_pvpBattleInfoCacheC = {} --重新发阵容了 没毛病
_pvpRecordInfoCache = {} -- 记录刷新了
_pvpRecordBattleInfoCache = {} -- 取新纪录的时候搞
_pvpStartBattleCache = nil
-- 请求上传录像
|
4cf74232
zhouhaihai
pvp
|
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
|
local params = {
["roleid"] = roleId,
["key"] = "zhaolugame20191016",
["time"] = now,
}
local status, body = httpc.get(remoteUrl, "/applyvideo?" .. httpGetFormatData(params), {}, {})
local video = nil
if tonumber(status) == 200 then
local result = json.decode(body)
video = result.name
else
skynet.error("applyvideo", "error", status, body, content)
end
-- 加入战斗记录
redisproxy:pipelining(function(red)
local dbKey = string.format(RECORD_PVP_COMMON, roleId)
red:lpush(dbKey, MsgPack.pack({
id = match.id,
t = match.t,
win = isWin,
time = now,
video = video,
sdelta = myScore - oldmyScore,
}))
red:trim(dbKey, 0, 9)
-- 对方加入战斗记录
if match.t == 1 then
dbKey = string.format(RECORD_PVP_COMMON, match.id)
red:lpush(dbKey, MsgPack.pack({
id = roleId,
t = 1,
win = not isWin,
time = now,
video = video,
sdelta = matchScore - oldMatchScore,
}))
red:trim(dbKey, 0, 9)
end
end)
|
3dbbc9f3
zhouhaihai
加上新的任务
|
287
288
289
290
|
if isWin then
role:checkTaskEnter("PvpWin", {score = myScore})
end
|
440aa055
zhouhaihai
聊天
|
291
|
|
4cf74232
zhouhaihai
pvp
|
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
|
SendPacket(actionCodes.Pvp_endBattleRpc, MsgPack.pack({
reward = reward,
myScore = myScore,
matchScore = matchScore,
oldmyScore = oldmyScore,
oldMatchScore = oldMatchScore,
myRank = myRank,
oldMyRank = oldMyRank,
video = video,
}))
return true
end
function _M.rankListRpc(agent, data)
local role = agent.role
local roleId = role:getProperty("id")
|
f317b790
zhouhaihai
pvp 遗留
|
308
|
local msg = MsgPack.unpack(data)
|
4cf74232
zhouhaihai
pvp
|
309
310
311
312
313
314
315
316
317
|
local ptype = msg.ptype or 1
local response = {}
if ptype == 1 then -- 普通pvp
local redret = redisproxy:pipelining(function(red)
red:zscore(RANK_PVP_COMMON, roleId)
red:zrevrank(RANK_PVP_COMMON, roleId)
red:zrevrange(RANK_PVP_COMMON, 0, 99, "WITHSCORES")
end)
|
3dbbc9f3
zhouhaihai
加上新的任务
|
318
|
local score = role:unpackPvpScore(redret[1] or 0)
|
4cf74232
zhouhaihai
pvp
|
319
|
local rank = tonumber(redret[2] or -2) + 1 --排名 1 - ... -1 未上榜 没打过pvp
|
b115474f
zhouhaihai
默认积分 1000
|
320
321
322
|
if rank == -1 then
score = globalCsv.pvp_base_score
end
|
4cf74232
zhouhaihai
pvp
|
323
324
|
local rankList = {}
for i = 1, #redret[3], 2 do
|
f317b790
zhouhaihai
pvp 遗留
|
325
326
|
local roleId = tonumber(redret[3][i])
local score = role:unpackPvpScore(redret[3][i + 1])
|
4cf74232
zhouhaihai
pvp
|
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
|
local online, curInfo = rpcRole(roleId, "friendSInfo")
curInfo.score = score
curInfo.roleId = roleId
table.insert(rankList, curInfo)
end
response.score = score
response.rank = rank
response.rankList = rankList
elseif ptype == 2 then -- 高级pvp
return
else
return
end
SendPacket(actionCodes.Pvp_rankListRpc, MsgPack.pack(response))
return true
end
function _M.recordListRpc(agent, data)
local role = agent.role
local roleId = role:getProperty("id")
local ptype = msg.ptype or 1
local recordList = {}
local now = skynet.timex()
if ptype == 1 then -- 普通pvp
local rlist = redisproxy:lrange(string.format(RECORD_PVP_COMMON, roleId), 0 , 9)
local tempList = {}
for _, temp in ipairs(rlist) do
local one = MsgPack.unpack(temp)
|
85083dba
zhouhaihai
拉黑从申请列表移除
|
358
|
if now - one.time <= globalCsv.pvp_record_keep_time then -- 大于一天的弃之
|
4cf74232
zhouhaihai
pvp
|
359
360
361
362
363
|
table.insert(tempList, one)
end
end
_pvpRecordInfoCache = tempList
|
3dbbc9f3
zhouhaihai
加上新的任务
|
364
|
recordList = getMatchInfo(role, tempList, _pvpRecordBattleInfoCache)
|
4cf74232
zhouhaihai
pvp
|
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
|
for idx, info in ipairs(recordList) do
local temp = tempList[idx]
info.win = temp.win
info.time = temp.time
info.video = temp.video
info.sdelta = temp.sdelta
end
elseif ptype == 2 then -- 高级pvp
return
else
return
end
SendPacket(actionCodes.Pvp_recordListRpc, MsgPack.pack({list = recordList}))
return true
|
440aa055
zhouhaihai
聊天
|
380
381
382
|
end
return _M
|