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
|
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,
}))
|
8c20d812
zhouhaihai
pvp bUg
|
272
|
red:ltrim(dbKey, 0, 9)
|
4cf74232
zhouhaihai
pvp
|
273
274
275
276
277
278
279
280
281
282
283
|
-- 对方加入战斗记录
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,
}))
|
8c20d812
zhouhaihai
pvp bUg
|
284
|
red:ltrim(dbKey, 0, 9)
|
4cf74232
zhouhaihai
pvp
|
285
286
|
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
|
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")
|
8c20d812
zhouhaihai
pvp bUg
|
349
|
local msg = MsgPack.unpack(data)
|
4cf74232
zhouhaihai
pvp
|
350
351
352
353
354
355
356
357
358
|
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
拉黑从申请列表移除
|
359
|
if now - one.time <= globalCsv.pvp_record_keep_time then -- 大于一天的弃之
|
4cf74232
zhouhaihai
pvp
|
360
361
362
363
364
|
table.insert(tempList, one)
end
end
_pvpRecordInfoCache = tempList
|
3dbbc9f3
zhouhaihai
加上新的任务
|
365
|
recordList = getMatchInfo(role, tempList, _pvpRecordBattleInfoCache)
|
4cf74232
zhouhaihai
pvp
|
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
|
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
聊天
|
381
382
383
|
end
return _M
|