Commit 9d5ba8bfa18ec3dce7f8c4392d7ec88577d31140

Authored by 熊润斐
2 parents 803170fd c7991bb0

Merge branch 'bugfix' into player

# Conflicts:
#	src/main.lua
robot/robot.conf
1 1 root = "./"
2   -thread = 8
  2 +thread = 4
3 3 logger = nil
4 4 harbor = 0
5   -start = "start" -- main script
  5 +start = "robot_main" -- main script
6 6 bootstrap = "snlua bootstrap" -- The service for bootstrap
7 7  
8 8 lua_path = root .."skynet/lualib/?.lua;"..root.."robot/?.lua;"..root.."src/?.lua"
... ...
robot/robot.lua
... ... @@ -16,6 +16,7 @@ local eventListener = {}
16 16  
17 17 local ignoreListener = {
18 18 ["Role.updateProperty"] = function(data)
  19 + if not client.role then return end
19 20 local msg = MsgPack.unpack(data)
20 21 for _, one in pairs(msg) do
21 22 client.role[one.key] = one.newValue
... ... @@ -80,7 +81,7 @@ function triggerListener(listener, data)
80 81 ignoreListener[listener](data)
81 82 end
82 83 else
83   - log(listener .. " no handle!!!")
  84 + -- log(listener .. " no handle!!!")
84 85 end
85 86 end
86 87  
... ... @@ -103,8 +104,8 @@ function sendServer(actionCode, bin)
103 104 end
104 105  
105 106 function requestServer(actionCode, bin, callback, isKeep)
106   - sendServer(actionCode, bin)
107 107 addListener(actionCode, callback, isKeep)
  108 + sendServer(actionCode, bin)
108 109 end
109 110  
110 111 local function heartBeat()
... ... @@ -120,7 +121,7 @@ local function startUnit(unit)
120 121  
121 122 local ok, unitTest = pcall(require, "unitTest." .. unit)
122 123 if not ok then
123   - print("unitTest load error : " .. unitTest)
  124 + log("unitTest load error : " .. unitTest)
124 125 end
125 126  
126 127 unitTest.new(client):startTest()
... ... @@ -130,6 +131,8 @@ end
130 131 -- 登录成功开始任务
131 132 function CMD.task()
132 133 heartBeat()
  134 + -- 20 秒后开始执行任务 错开登录
  135 + skynet.sleep(math.randomInt(2000, 3000))
133 136 startUnit()
134 137 end
135 138  
... ... @@ -142,7 +145,7 @@ function CMD.start(fd, id)
142 145 client.uname = uname
143 146 local status, body = httpc.get(config.http, "/login?" .. httpGetFormatData({token = uname, device = "test", channel = "develop"}))
144 147 if tonumber(status) ~= 200 then
145   - print("http get error", uname, body)
  148 + log("http get error", uname, body)
146 149 return
147 150 end
148 151 local servInfo = json.decode(body)
... ... @@ -170,7 +173,7 @@ skynet.register_protocol {
170 173 dispatch = function(session, address, cmd, data)
171 174 local actionName = actionHandlers[cmd]
172 175 if not actionName then
173   - print("actionName not exist", actionName)
  176 + log("actionName not exist", actionName)
174 177 return
175 178 end
176 179  
... ...
robot/robot_config.lua
... ... @@ -10,7 +10,7 @@ end
10 10  
11 11  
12 12 return {
13   - http = "http://106.13.60.20:9090", -- 登录服
  13 + http = "http://192.168.0.199:9090", -- 登录服
14 14 host = "127.0.0.1", --服务器地址
15 15 port = 12001, -- 服务器端口
16 16  
... ... @@ -20,15 +20,15 @@ return {
20 20 max = 200, -- 最大玩家数 必须大于 online 数
21 21 online_time = {10 * 60, 20 * 60}, -- 在线时间控制 秒
22 22  
23   - uname_prefix = "robot", --机器名称前缀
  23 + uname_prefix = "robothehe", --机器名称前缀
24 24  
25 25  
26 26 -- 机器上线后的行为
27 27 units = {
28 28 chat = {weight = 100}, -- 聊天
29 29 item = {weight = 100}, -- 物品操作
30   - hero = {weight = 500}, -- 英雄
31   - hang = {weight = 1000}, -- 挂机战斗
  30 + hero = {weight = 500}, -- 英雄
  31 + hang = {weight = 1000}, -- 挂机战斗
32 32 tower = {weight = 500}, -- 爬塔
33 33 car = {weight = 100}, -- 爬塔
34 34 pvp = {weight = 500}, -- pvp
... ...
robot/robot_main.lua 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +local skynet = require "skynet"
  2 +local config = require "robot_config"
  3 +
  4 +local preOnlineCount = 10
  5 +
  6 +
  7 +skynet.start(function()
  8 + local need = math.ceil(config.online / preOnlineCount)
  9 + local inpre = math.ceil(config.inpre / need)
  10 + local idRange = math.ceil(config.max / need)
  11 + local curId = 1
  12 + local poold = skynet.newservice("robot_pool")
  13 + local pooldObj = skynet.call(poold, "lua", "start", config.online + preOnlineCount)
  14 +
  15 + for i = 1, need do
  16 + local start = skynet.newservice("start")
  17 + skynet.send(start, "lua", "start", poold, pooldObj, preOnlineCount, curId, curId + idRange - 1, inpre)
  18 + curId = curId + idRange
  19 + end
  20 + skynet.exit()
  21 +end)
0 22 \ No newline at end of file
... ...
robot/robot_pool.lua 0 → 100644
... ... @@ -0,0 +1,46 @@
  1 +--[[
  2 + deque 为了减少锁竞争,尽量保证 a服务 push;b服务 pop
  3 +]]
  4 +local skynet = require "skynet"
  5 +local deque = require "deque"
  6 +
  7 +local CMD = {}
  8 +local factory
  9 +
  10 +local PRE_FEED_COUNT = 5
  11 +local dead = 0
  12 +-- agent死亡,通知poold补充,当累计到5个agent时,马上生成5个agent放入poold中
  13 +-- 当然这里也可以写得更复杂,参考redis落地规则
  14 +function CMD.feed()
  15 + dead = dead + 1
  16 + if dead == PRE_FEED_COUNT then
  17 + dead = 0
  18 + for i=1, PRE_FEED_COUNT do
  19 + factory:push(skynet.newservice("robot"))
  20 + end
  21 + end
  22 +end
  23 +
  24 +-- 系统启动,生成count个agent放入双端队列中
  25 +function CMD.start(count)
  26 + factory, addr = deque.new(count)
  27 +
  28 + for i = 1, count do
  29 + factory:push(skynet.newservice("robot"))
  30 + end
  31 +
  32 + return addr
  33 +end
  34 +
  35 +local function __init__()
  36 + skynet.dispatch("lua", function (_, _, command, ...)
  37 + local f = CMD[command]
  38 + if command == "start" then
  39 + skynet.ret(skynet.pack(f(...)))
  40 + return
  41 + end
  42 + f(...)
  43 + end)
  44 +end
  45 +
  46 +skynet.start(__init__)
... ...
robot/start.lua
... ... @@ -5,32 +5,37 @@ local config = require "robot_config"
5 5 local skynet = require "skynet"
6 6 local netpack = require "skynet.netpack"
7 7 local socketdriver = require "skynet.socketdriver"
  8 +local deque = require "deque"
8 9 local string_format = string.format
9 10  
  11 +local poold, pooldObj, onlineCount, startId, endId, inpre
  12 +local factory
  13 +
10 14 local queue = {}
11 15 local fd2serv = {}
12 16 local id2fd = {}
13 17 local MSG = {}
14   -local id_max = 0 -- robot id
  18 +local id_max
15 19  
16 20  
17 21 function MSG.open( ... )
18   - print("open", ...)
  22 + log("open", ...)
19 23 end
20 24  
21 25 function MSG.close(fd)
22 26 if fd2serv[fd] and not fd2serv[fd].closing then
23 27 fd2serv[fd].closing = true
24 28 skynet.call(fd2serv[fd].agent, "lua", "exit")
25   - log(string_format("logout %s", fd2serv[fd].id))
  29 + pcall(skynet.send, poold, "lua", "feed")
26 30  
  31 + log(string_format("logout %s", fd2serv[fd].id))
27 32 id2fd[fd2serv[fd].id] = nil
28 33 fd2serv[fd] = nil
29 34 end
30 35 end
31 36  
32 37 function MSG.error(fd, msg)
33   - print("MSG.error", fd, msg)
  38 + log("MSG.error", fd, msg)
34 39 MSG.close(fd)
35 40 end
36 41  
... ... @@ -72,13 +77,14 @@ skynet.register_protocol {
72 77 }
73 78  
74 79 local function add_robot()
75   - local robot = skynet.newservice("robot")
  80 + local time = skynet.time()
  81 + local robot = factory:pop()
76 82 local fd = socketdriver.connect(config.host, config.port)
77 83 socketdriver.start(fd)
78 84 local id
79   - if id_max >= config.max then
  85 + if id_max >= endId then
80 86 while true do
81   - id = math.randomInt(1, config.max)
  87 + id = math.randomInt(startId, endId)
82 88 if not id2fd[id] then
83 89 break
84 90 end
... ... @@ -89,9 +95,8 @@ local function add_robot()
89 95 end
90 96 fd2serv[fd] = {agent = robot, id = id}
91 97 id2fd[id] = fd
92   - pcall(skynet.call, robot, "lua", "start", fd, id)
  98 + pcall(skynet.call, robot, "lua", "start", fd, id, prefix)
93 99 log(string_format("login %s", fd2serv[fd].id))
94   -
95 100 -- 定时下线
96 101 skynet.timeout(math.randomInt(config.online_time[1], config.online_time[2]) * 100, function()
97 102 MSG.close(fd)
... ... @@ -106,8 +111,8 @@ local function online()
106 111 end
107 112  
108 113 -- 及时补充人数
109   - if curCount < config.online then
110   - for i = curCount + 1, config.online do
  114 + if curCount < onlineCount then
  115 + for i = curCount + 1, onlineCount do
111 116 add_robot()
112 117 end
113 118 end
... ... @@ -116,11 +121,18 @@ local function online()
116 121 skynet.timeout(100, online)
117 122 end
118 123  
119   -local function start()
  124 +local function start(pooldp, pooldObj, onlineCountp, startIdp, endIdp, inprep)
120 125 log("start testing ...")
121 126  
122   - for i = 1, config.online, config.inpre do
123   - for j = 1, config.inpre do
  127 + factory = deque.clone(pooldObj)
  128 + poold, onlineCount, startId, endId, inpre = pooldp, onlineCountp, startIdp, endIdp, inprep
  129 + id_max = startId - 1
  130 +
  131 + for i = 1, onlineCount, inpre do
  132 + for j = 1, inpre do
  133 + if i + j - 1 > onlineCount then
  134 + break
  135 + end
124 136 add_robot()
125 137 end
126 138 skynet.sleep(100)
... ... @@ -131,5 +143,10 @@ local function start()
131 143 end
132 144  
133 145 skynet.start(function()
134   - skynet.fork(start)
  146 + skynet.dispatch("lua", function (_, _, command, ...)
  147 + if command == "start" then
  148 + start(...)
  149 + return
  150 + end
  151 + end)
135 152 end)
136 153 \ No newline at end of file
... ...
robot/unitTest/adv.lua
... ... @@ -8,6 +8,8 @@ local _M = class(&quot;hang&quot;, require(&quot;unitTest.unitTest&quot;))
8 8  
9 9 function _M:start()
10 10 sendServer(actionCodes.Gm_clientRequest, MsgPack.pack({cmd = "fb", pm1 = 10606}))
  11 + requestServer(actionCodes.Adv_roleFormatRpc, MsgPack.pack({index = 1, title = "hehe", leader = 1, leader2 = 2, heros = {[1] = 1, [2] = 2}}))
  12 + requestServer(actionCodes.Adv_selectTeamRpc, MsgPack.pack({index = 1}))
11 13 self:task()
12 14 end
13 15  
... ... @@ -24,8 +26,8 @@ function _M:task()
24 26 end
25 27  
26 28 function _M:startAdv()
27   - sendServer(actionCodes.Gm_clientRequest, MsgPack.pack({cmd = "advf", pm1 = 10606}))
28   - requestServer(actionCodes.Adv_startAdvRpc, MsgPack.pack({chapterId = 101, format = {leader = 1, leader2 = 2, heros = {[1] = 1, [2] = 2}}}))
  29 + sendServer(actionCodes.Gm_clientRequest, MsgPack.pack({cmd = "advf"}))
  30 + requestServer(actionCodes.Adv_startAdvRpc, MsgPack.pack({chapterId = 101}))
29 31 requestServer(actionCodes.Adv_exitAdvRpc, '')
30 32 end
31 33  
... ...
robot/unitTest/hero.lua
... ... @@ -35,8 +35,8 @@ function _M:drawHero10()
35 35 end
36 36  
37 37 function _M:createHeroRandom()
38   - sendServer(actionCodes.Gm_clientRequest, MsgPack.pack({cmd = "get", pm1 = 703, pm2 = 20}))
39   - requestServer(actionCodes.Hero_createHeroRandomRpc, MsgPack.pack({itemId = 703}))
  38 + sendServer(actionCodes.Gm_clientRequest, MsgPack.pack({cmd = "get", pm1 = 722, pm2 = 40}))
  39 + requestServer(actionCodes.Hero_createHeroRandomRpc, MsgPack.pack({itemId = 722}))
40 40 end
41 41  
42 42  
... ...
robot/unitTest/item.lua
... ... @@ -14,7 +14,7 @@ end
14 14 local taskMap = {
15 15 saleItem = {100},
16 16 openItem = {100},
17   - openTimeBox = {100},
  17 + -- openTimeBox = {100},
18 18 }
19 19  
20 20 function _M:task()
... ... @@ -31,8 +31,8 @@ end
31 31  
32 32  
33 33 function _M:openItem()
34   - sendServer(actionCodes.Gm_clientRequest, MsgPack.pack({cmd = "get", pm1 = 701, pm2 = 20}))
35   - requestServer(actionCodes.Role_openItemRpc, MsgPack.pack({itemId = 701, count = 1}))
  34 + sendServer(actionCodes.Gm_clientRequest, MsgPack.pack({cmd = "get", pm1 = 831, pm2 = 1}))
  35 + requestServer(actionCodes.Role_openItemRpc, MsgPack.pack({itemId = 831, count = 1}))
36 36 end
37 37  
38 38 function _M:openTimeBox()
... ...
src/GlobalVar.lua
... ... @@ -134,8 +134,8 @@ ItemId = {
134 134 RuneFragment = 24,
135 135 HeroFC = {700, 701, 702, 703}, --通用角色碎片
136 136 AdvKey = 80, -- 冒险钥匙
137   - BoxKey = 60, -- 拆解工具
138 137 AdvPower = 4701, -- 拾荒体力
  138 + CrisisScore = 8010, -- 积分
139 139 }
140 140  
141 141 TimeReset = {
... ... @@ -292,6 +292,10 @@ CardType = {
292 292 BattlePassCard = 7, -- 探索指令
293 293 }
294 294  
  295 +ShopPackType = {
  296 + ActShopPack = 5, -- 活动礼包
  297 +}
  298 +
295 299 HeroQuality = {
296 300 N = 1,
297 301 R = 2,
... ... @@ -318,6 +322,8 @@ MailId = {
318 322  
319 323 PaySignAward = 241,
320 324 PayBackAward = 242,
  325 + CBBackAward = 243,
  326 + CBBackAward2 = 244,
321 327 }
322 328  
323 329 TriggerEventType = {
... ...
src/ProtocolCode.lua
... ... @@ -227,6 +227,8 @@ actionCodes = {
227 227 Activity_endBattleRpc = 661,
228 228 Activity_battleRankRpc = 662,
229 229 Activity_battleMilestoneRpc = 663,
  230 + Activity_bossRewardRpc = 664,
  231 + Activity_crisisMilestoneRpc = 665,
230 232  
231 233 Radio_startQuestRpc = 700,
232 234 Radio_finishQuestRpc = 701,
... ...
src/RedisKeys.lua
... ... @@ -19,6 +19,7 @@ R_ORDER = &quot;order:%d:%d&quot;
19 19 RANK_COMMON = "rank:common:"
20 20 RANK_TYPE = {
21 21 ActBattleBoss = "act_battle_boss",
  22 + ActCrisis = "crisis",
22 23 }
23 24  
24 25 -- rank
... ...
src/actions/ActivityAction.lua
... ... @@ -192,13 +192,13 @@ function _M.actPaySignRpc(agent, data)
192 192 local open, actId = role.activity:isOpen("PaySignIn")
193 193 if not open then return 2 end
194 194  
195   - local diffDay = diffFromTs(ts) + 1
  195 + --local diffDay = diffFromTs(ts) + 1
196 196  
197 197 local curData = role.activity:getActData("PaySignIn")
198 198 if not curData then return 3 end
199 199 local reward, change = {}
200 200 for day, csvData in ipairs(csvdb["pay_signInCsv"]) do
201   - if day <= diffDay and day == dayIndex then
  201 + if day <= (curData[0] or 0) and day == dayIndex then
202 202 if not curData[day] then
203 203 curData[day] = 1
204 204 -- 奖励
... ... @@ -268,7 +268,8 @@ function _M.exchangeRpc(agent, data)
268 268 local msg = MsgPack.unpack(data)
269 269 local actid = msg.actid
270 270 local id = msg.id
271   - if not role.activity:isOpenById(actid) then return 1 end
  271 + local count = msg.count
  272 + if not role.activity:isOpenById(actid, "Exchange") then return 1 end
272 273  
273 274 local exchangeCfg = csvdb["activity_exchangeCsv"][actid]
274 275 if not exchangeCfg then return 2 end
... ... @@ -278,18 +279,26 @@ function _M.exchangeRpc(agent, data)
278 279 local curCount = exchangeData[id] or 0
279 280 local actCfg = exchangeCfg[id]
280 281 local limitArr = actCfg.limit:toArray(true, "=")
281   - if curCount >= limitArr[2] then return 4 end
  282 + if curCount + count > limitArr[2] then return 4 end
282 283  
283 284 local costs = actCfg.goods:toNumMap()
  285 + for k,v in pairs(costs) do
  286 + costs[k] = v * count
  287 + end
284 288 if not role:checkItemEnough(costs) then return 5 end
285 289 role:costItems(costs, {log = {desc = "actExchange", int1 = actid, int2 = id}})
286 290  
287   - curCount = curCount + 1
  291 + curCount = curCount + count
288 292 exchangeData[id] = curCount
289 293 curData[actid] = exchangeData
290 294 role.activity:updateActData("Exchange", curData)
291 295  
292   - local reward, change = role:award(actCfg.award, {log = {desc = "actExchange", int1 = actid, int2 = id}})
  296 + local award = actCfg.award:toNumMap()
  297 + for k,v in pairs(award) do
  298 + award[k] = v * count
  299 + end
  300 +
  301 + local reward, change = role:award(award, {log = {desc = "actExchange", int1 = actid, int2 = id}})
293 302  
294 303  
295 304 SendPacket(actionCodes.Activity_exchangeRpc, MsgPack.pack(role:packReward(reward, change)))
... ... @@ -304,7 +313,7 @@ function _M.gachakonRpc(agent, data)
304 313  
305 314 if count > 10 then return end
306 315  
307   - if not role.activity:isOpenById(actid) then return 1 end
  316 + if not role.activity:isOpenById(actid, "Gachakon") then return 1 end
308 317  
309 318 local actCtrlData = csvdb["activity_ctrlCsv"][actid]
310 319 if not actCtrlData then return 2 end
... ... @@ -316,6 +325,7 @@ function _M.gachakonRpc(agent, data)
316 325 local gachakonInfo = role.activity:getActData("Gachakon") or {}
317 326 local award = {}
318 327 local remain = 0
  328 + local showAward = {}
319 329 for i = 1, count do
320 330 local tmpCfg = clone(actCfg)
321 331 remain = 0
... ... @@ -335,6 +345,7 @@ function _M.gachakonRpc(agent, data)
335 345 if not id then return 4 end
336 346 gachakonInfo[id] = (gachakonInfo[id] or 0) + 1
337 347 local curAward = tmpCfg[id].award:toNumMap()
  348 + table.insert(showAward, curAward)
338 349 for k, v in pairs(curAward) do
339 350 award[k] = (award[k] or 0) + v
340 351 end
... ... @@ -355,7 +366,7 @@ function _M.gachakonRpc(agent, data)
355 366 end
356 367 role.activity:updateActData("Gachakon", gachakonInfo)
357 368  
358   - SendPacket(actionCodes.Activity_gachakonRpc, MsgPack.pack(role:packReward(reward, change)))
  369 + SendPacket(actionCodes.Activity_gachakonRpc, MsgPack.pack(showAward))
359 370 return true
360 371 end
361 372  
... ... @@ -363,7 +374,7 @@ function _M.hangDropRpc(agent, data)
363 374 local role = agent.role
364 375 local msg = MsgPack.unpack(data)
365 376 local actid = msg.actid
366   - if not role.activity:isOpenById(actid) then return 1 end
  377 + if not role.activity:isOpenById(actid, "HangDrop") then return 1 end
367 378  
368 379 local actCfg = csvdb["activity_putCsv"][actid]
369 380 if not actCfg then return 2 end
... ... @@ -380,7 +391,7 @@ function _M.hangDropRpc(agent, data)
380 391 if type == 1 then
381 392 local actId = arr[2]
382 393 local carbonId = arr[3]
383   - if not role.activity:isOpenById(actid) then return 3 end
  394 + if not role.activity:isOpenById(actId, "ChallengeLevel") then return 3 end
384 395 local clInfo = role.activity:getActData("ChallengeLevel") or {}
385 396 if not clInfo[carbonId] then
386 397 break
... ... @@ -437,7 +448,7 @@ function _M.startBattleRpc(agent, data)
437 448 local actid = msg.actid
438 449 local id = msg.id
439 450 local count = msg.count
440   - if not role.activity:isOpenById(actid) then return 1 end
  451 + if not role.activity:isOpenById(actid, "ChallengeLevel") then return 1 end
441 452  
442 453 local actCfg = csvdb["activity_battleCsv"][actid]
443 454 if not actCfg then return 2 end
... ... @@ -461,9 +472,10 @@ function _M.startBattleRpc(agent, data)
461 472 -- check cost
462 473 local changeFlag = false
463 474 local ticket = actData["ticket"]
  475 + local num = 0 -- cost num
464 476 if battleCfg.type ~= "" then
465 477 role.activity:getBattleTicket(actid)
466   - local num = battleCfg.type:toArray(true, "=")[3]
  478 + num = battleCfg.type:toArray(true, "=")[3]
467 479 if count and count > 0 then
468 480 if battleCfg.rank == 0 then
469 481 return 7
... ... @@ -479,9 +491,10 @@ function _M.startBattleRpc(agent, data)
479 491 if ticket < num then
480 492 return 6
481 493 end
482   - actData["ticket"] = ticket - num
483 494 changeFlag = true
484 495 end
  496 + -- 解锁活动剧情
  497 + role:checkStoryStatus(false, 5, id)
485 498  
486 499 if not count then
487 500 role.__actBattleCache = {
... ... @@ -512,7 +525,12 @@ function _M.startBattleRpc(agent, data)
512 525 local reward, change = role:award(award, {log = {desc = "actBattle", int1 = actid, int2 = count or 0}})
513 526 SendPacket(actionCodes.Activity_startBattleRpc, MsgPack.pack(role:packReward(reward, change)))
514 527  
  528 + if battleCfg.worldBoss_award ~= 0 and (bi["maxP"] or 0) > 0 then
  529 + bi["bossP"] = (bi["bossP"] or 0) + bi["maxP"]
  530 + end
  531 +
515 532 bi["sum"] = bi["sum"] + bi["top"]
  533 + actData["ticket"] = ticket - num
516 534 actData[id] = bi
517 535 changeFlag = true
518 536  
... ... @@ -540,7 +558,7 @@ function _M.endBattleRpc(agent, data)
540 558 local isWin = msg.isWin
541 559 local heros = msg.heros
542 560 local support = msg.support
543   - if not role.activity:isOpenById(actid) then return 1 end
  561 + if not role.activity:isOpenById(actid, "ChallengeLevel") then return 1 end
544 562  
545 563 if not role.__actBattleCache then return 2 end
546 564  
... ... @@ -556,6 +574,14 @@ function _M.endBattleRpc(agent, data)
556 574  
557 575 local actData = role.activity:getActData("ChallengeLevel") or {}
558 576  
  577 + -- 总输出
  578 + local dmg = 0
  579 + for k, v in pairs(msg.info.damage) do
  580 + if k % 100 == 2 then
  581 + dmg = dmg + v
  582 + end
  583 + end
  584 +
559 585 local reward, change = {}, nil
560 586  
561 587 local battleInfo = actData[id] or {}
... ... @@ -611,6 +637,10 @@ function _M.endBattleRpc(agent, data)
611 637 check[7] = function(_, cond)
612 638 return msg.info.atime and msg.info.atime <= cond
613 639 end
  640 + -- 8 总输出值 msg.info.atime
  641 + check[8] = function(_, cond)
  642 + return dmg >= cond
  643 + end
614 644 curStar = 0
615 645 local sweepConds = battleCfg.sweep_condition:toTableArray(true)
616 646 for i, cond in ipairs(sweepConds) do
... ... @@ -618,8 +648,11 @@ function _M.endBattleRpc(agent, data)
618 648 curStar = curStar + (1 << (i - 1))
619 649 end
620 650 end
621   - else
622   - curStar = 0
  651 + else
  652 + curStar = 0
  653 + if battleCfg.rank ~= 0 then
  654 + curStar = 1
  655 + end
623 656 end
624 657 local oldStarNum = getStarCount(battleCfg, battleInfo["star"] or 0)
625 658 local newStarNum = getStarCount(battleCfg, curStar)
... ... @@ -627,14 +660,13 @@ function _M.endBattleRpc(agent, data)
627 660 battleInfo["star"] = curStar
628 661 end
629 662  
630   - if battleCfg.rank ~= 0 then
  663 + if battleCfg.rank ~= 0 and isWin then
  664 + -- 消耗门票
  665 + role.activity:getBattleTicket(actid)
  666 + local num = battleCfg.type:toArray(true, "=")[3]
  667 + actData["ticket"] = math.max(actData["ticket"] - num, 0)
  668 +
631 669 -- 更新排行榜 最高伤害
632   - local dmg = 0
633   - for k, v in pairs(msg.info.damage) do
634   - if k % 100 == 2 then
635   - dmg = dmg + v
636   - end
637   - end
638 670 battleInfo["top"] = math.max(battleInfo["top"] or 0, dmg)
639 671 battleInfo["sum"] = (battleInfo["sum"] or 0) + dmg
640 672 local rankVal = 0
... ... @@ -647,13 +679,11 @@ function _M.endBattleRpc(agent, data)
647 679 role:updateRankCommon(RANK_TYPE.ActBattleBoss, rankVal)
648 680 end
649 681 end
650   - actData[id] = battleInfo
651   - role.activity:updateActData("ChallengeLevel", actData)
652 682  
653   - if oldStarNum == 0 or battleCfg.rank ~= 0 then
  683 + if (oldStarNum == 0 and newStarNum > 0) or battleCfg.rank ~= 0 then
654 684 reward = battleCfg.item_clear:toNumMap()
655 685 end
656   - if (oldStarNum < 3 and newStarNum == 3) or battleCfg.rank ~= 0 then
  686 + if (oldStarNum < 3 and newStarNum == 3) or (battleCfg.rank ~= 0 and newStarNum == 3) then
657 687 local aw = battleCfg.perfect_reward:toNumMap()
658 688 for k, v in pairs(aw) do
659 689 reward[k] = (reward[k] or 0) + v
... ... @@ -670,6 +700,18 @@ function _M.endBattleRpc(agent, data)
670 700 supports = support,
671 701 })
672 702  
  703 + -- 解锁活动剧情
  704 + if newStarNum >= 3 then
  705 + role:checkStoryStatus(false, 5, id)
  706 + end
  707 +
  708 + if battleCfg.worldBoss_award ~= 0 and msg.point then
  709 + battleInfo["bossP"] = (battleInfo["bossP"] or 0) + msg.point
  710 + battleInfo["maxP"] = math.max(msg.point, (battleInfo["maxP"] or 0))
  711 + end
  712 + actData[id] = battleInfo
  713 + role.activity:updateActData("ChallengeLevel", actData)
  714 +
673 715 reward, change = role:award(reward, {log = {desc = "actBattle", int1 = actid, int2 = newStarNum}})
674 716  
675 717 SendPacket(actionCodes.Activity_endBattleRpc, MsgPack.pack({
... ... @@ -684,10 +726,15 @@ function _M.battleRankRpc(agent, data)
684 726 local role = agent.role
685 727 local msg = MsgPack.unpack(data)
686 728 local actid = msg.actid
687   - if not role.activity:isOpenById(actid) then return 1 end
688   -
689   - local rankInfo = role:getRankInfoCommon(RANK_TYPE.ActBattleBoss)
690   -
  729 + local cfg = csvdb["activity_ctrlCsv"][actid]
  730 + if not cfg then return 1 end
  731 + if not role.activity:isOpen(cfg.showType) then return 2 end
  732 + local actTypeToRank = {
  733 + [role.activity.ActivityType.ChallengeLevel] = RANK_TYPE.ActBattleBoss,
  734 + [role.activity.ActivityType.Crisis] = RANK_TYPE.ActCrisis,
  735 + }
  736 + if not actTypeToRank[cfg.showType] then return end
  737 + local rankInfo = role:getRankInfoCommon(actTypeToRank[cfg.showType])
691 738 SendPacket(actionCodes.Activity_battleRankRpc, MsgPack.pack(rankInfo))
692 739 return true
693 740 end
... ... @@ -699,7 +746,7 @@ function _M.battleMilestoneRpc(agent, data)
699 746 local id = msg.id
700 747 local index = msg.index
701 748  
702   - if not role.activity:isOpenById(actid) then return 1 end
  749 + if not role.activity:isOpenById(actid, "ChallengeLevel") then return 1 end
703 750  
704 751 local actCfg = csvdb["activity_mileageCsv"][actid]
705 752 if not actCfg then return 3 end
... ... @@ -732,4 +779,93 @@ function _M.battleMilestoneRpc(agent, data)
732 779 return true
733 780 end
734 781  
  782 +function _M.crisisMilestoneRpc(agent, data)
  783 + local role = agent.role
  784 + local msg = MsgPack.unpack(data)
  785 + local actid = msg.actid
  786 + local id = msg.id
  787 + if not role.activity:isOpenById(actid, "Crisis") then return 1 end
  788 + local actCfg = csvdb["activity_mileageCsv"][actid]
  789 + if not actCfg then return 3 end
  790 +
  791 + local curCsv = actCfg[id]
  792 + if not curCsv then return 4 end
  793 +
  794 + if role:getItemCount(ItemId.CrisisScore) < curCsv.condition then
  795 + return 5
  796 + end
  797 +
  798 + local actData = role.activity:getActData("Crisis") or {}
  799 + actData.score = actData.score or {}
  800 + if actData.score[id] then
  801 + return 6
  802 + end
  803 + actData.score[id] = -1
  804 + role.activity:updateActData("Crisis", actData)
  805 +
  806 + local reward, change = role:award(curCsv.reward, {log = {desc = "actMilecrisis", int1 = actid}})
  807 + SendPacket(actionCodes.Activity_crisisMilestoneRpc, MsgPack.pack(role:packReward(reward, change)))
  808 + return true
  809 +end
  810 +
  811 +
  812 +function _M.bossRewardRpc(agent, data)
  813 + local role = agent.role
  814 + local msg = MsgPack.unpack(data)
  815 + local actid = msg.actid
  816 + local id = msg.id
  817 + local index = msg.index
  818 +
  819 + if not role.activity:isOpenById(actid, "ChallengeLevel") then return 1 end
  820 +
  821 + local actCfg = csvdb["activity_battleCsv"][actid]
  822 + if not actCfg then return 2 end
  823 +
  824 + local battleCfg = actCfg[id]
  825 + if not battleCfg then return 3 end
  826 +
  827 + if battleCfg.worldBoss_award == 0 then return 4 end
  828 +
  829 + actCfg = csvdb["activity_wordboss_awardCsv"][battleCfg.worldBoss_award]
  830 + if not actCfg then return 5 end
  831 + local awardCfg = actCfg[index]
  832 + if not awardCfg then return 6 end
  833 +
  834 + local preList = awardCfg.condition1:toArray(true, "=")
  835 +
  836 + local actData = role.activity:getActData("ChallengeLevel") or {}
  837 + local battleInfo = actData[id] or {}
  838 + local bossPoint = battleInfo["bossP"] or 0
  839 + if bossPoint < 1 then return 7 end
  840 +
  841 + local bossRecord = battleInfo["bossR"] or ""
  842 + local r = string.char(string.getbit(bossRecord, index))
  843 + if r == "1" then
  844 + return 9
  845 + end
  846 + local ok = false
  847 + if #preList == 0 then
  848 + ok = true
  849 + else
  850 + for _, i in ipairs(preList) do
  851 + local flag = string.char(string.getbit(bossRecord, i))
  852 + if flag == "1" then
  853 + ok = true
  854 + break
  855 + end
  856 + end
  857 + end
  858 + if not ok then return 8 end
  859 +
  860 + battleInfo["bossR"] = string.setbit(bossRecord, index)
  861 + battleInfo["bossP"] = bossPoint - 1
  862 + actData[id] = battleInfo
  863 + role.activity:updateActData("ChallengeLevel", actData)
  864 +
  865 + local award = awardCfg.reward:toNumMap()
  866 + local reward, change = role:award(award, {log = {desc = "worldBossReward", int1 = actid, int2 = index}})
  867 + SendPacket(actionCodes.Activity_bossRewardRpc, MsgPack.pack(role:packReward(reward, change)))
  868 + return true
  869 +end
  870 +
735 871 return _M
736 872 \ No newline at end of file
... ...
src/actions/DinerAction.lua
... ... @@ -598,6 +598,7 @@ function _M.updateTaskRpc( agent, data )
598 598 restaurant_order_status = cmd, -- 订单任务状态,接受:0, 拒绝:1, 完成:2
599 599 restaurant_order_rwd = reward or {}, -- 订单完成奖励,json格式记录,{"itemid1":123,"itemid2":12,……….}
600 600 restaurant_order_lv = taskData.rarity, -- 订单品质等级,普通:0, 稀有:1, 顶级:2, 豪华:3
  601 + restaurant_order_type = 1, -- 订单任务类型,0:特殊顾客,1:特别订单
601 602 })
602 603  
603 604 role.dinerData:updateProperty({field = "order", value = json.encode(orders)})
... ... @@ -896,6 +897,14 @@ function _M.entrustRpc(agent , data)
896 897  
897 898 reward, change = role:award(curData.reward, {log = {desc = "dinerEntrus", int1 = entrustId}})
898 899 table.remove(entrust, 1)
  900 +
  901 + role:log("restaurant_order", {
  902 + restaurant_order_id = entrustId, -- 订单任务ID
  903 + restaurant_order_status = 2, -- 订单任务状态,接受:0, 拒绝:1, 完成:2
  904 + restaurant_order_rwd = reward or {}, -- 订单完成奖励,json格式记录,{"itemid1":123,"itemid2":12,……….}
  905 + restaurant_order_lv = curData.type, -- 订单品质等级,普通:0, 稀有:1, 顶级:2, 豪华:3
  906 + restaurant_order_type = 0, -- 订单任务类型,0:特殊顾客,1:特别订单
  907 + })
899 908 elseif ctype == 2 then -- 放弃
900 909 table.remove(entrust, 1)
901 910 else
... ...
src/actions/GmAction.lua
... ... @@ -502,6 +502,11 @@ function _M.guide(role, pms)
502 502 end
503 503 end
504 504 end
  505 + for _, data in pairs(csvdb["guide_unlockCsv"]) do
  506 + if data.type == 0 or data.type == 3 then
  507 + str = str:setv(data.id,1)
  508 + end
  509 + end
505 510 role:updateProperty({field = "funcGuide", value = str})
506 511 role:mylog("gm_action", {desc = "sguide", key1 = pms.sender})
507 512  
... ... @@ -524,6 +529,16 @@ function _M.guide(role, pms)
524 529 return "成功"
525 530 end
526 531  
  532 +table.insert(helpDes, {"挑战关卡次数", "actbattle"})
  533 +function _M.actbattle(role, pms)
  534 + if not role.activity:isOpen("ChallengeLevel") then return end
  535 + local actData = role.activity:getActData("ChallengeLevel")
  536 + actData["ticket"] = 100
  537 + role.activity:updateActData("ChallengeLevel", actData)
  538 +
  539 + return "成功"
  540 +end
  541 +
527 542 function _M.helpRpc(agent, data)
528 543 SendPacket(actionCodes.Gm_helpRpc, MsgPack.pack({help = helpDes}))
529 544 return true
... ...
src/actions/HangAction.lua
... ... @@ -498,46 +498,49 @@ function _M.buyBonusCountRpc(agent, data)
498 498 return true
499 499 end
500 500  
501   -local function bonusWinReward(role, bonusData, bwin, count)
  501 +local function bonusWinReward(role, bonusData, rewardType, count)
502 502 count = count or 1
503   - local open, actId = role.activity:isOpen("BonusDouble")
504   - local actData = csvdb["activity_ctrlCsv"][actId]
505   - local extraCnt = role.storeData:getBonusExtraFightCount()
506   -
507   - local coef = 1
508   - if open and actData then
509   - coef = tonumber(actData.condition2)
510   - end
511   - local bonusC = role.dailyData:getProperty("bonusC")
512   - bonusC[bonusData.type] = bonusC[bonusData.type] or {c = 0, b = 0}
513   - if globalCsv.bonus_daily_count * coef + extraCnt - bonusC[bonusData.type]["c"] < count then return false, 1 end
514   - bonusC[bonusData.type]["c"] = bonusC[bonusData.type]["c"] + count
515   - role.dailyData:updateProperty({field = "bonusC", value = bonusC})
516 503  
517   - local reward, change
518   - reward = bonusData.reward:toNumMap()
519   - for itemId, c in pairs(reward) do
520   - reward[itemId] = c * count
521   - end
522   - for i = 1, count do
523   - local chance = bonusData.chance:randWeight(true)
524   - if chance[1] ~= 0 then
525   - reward[chance[1]] = (reward[chance[1]] or 0) + chance[2]
  504 + local reward, change = {}
  505 + if rewardType == 1 or rewardType == 4 then
  506 + for k, v in pairs(bonusData.clear_reward:toNumMap()) do
  507 + reward[k] = (reward[k] or 0) + v
526 508 end
527 509 end
528 510  
529   - for k, v in pairs(reward) do
530   - reward[k] = v * (coef > 1 and actData.condition or 1)
531   - end
532   -
533   - if bwin then -- 满星 额外奖励
  511 + if rewardType == 2 or rewardType == 4 then
534 512 for k, v in pairs(bonusData.perfect_reward:toNumMap()) do
535 513 reward[k] = (reward[k] or 0) + v
536 514 end
537 515 end
538   - reward, change = role:award(reward, {log = {desc = "bonusBattle", int1 = id}})
539   - role:checkTaskEnter("BonusPass", {id = id, count = count})
540   - return true, reward, change
  516 +
  517 + if rewardType == 3 then
  518 + local open, actId = role.activity:isOpen("BonusDouble")
  519 + local actData
  520 + if open then
  521 + actData = csvdb["activity_ctrlCsv"][actId]
  522 + end
  523 +
  524 + reward = bonusData.reward:toNumMap()
  525 + for itemId, c in pairs(reward) do
  526 + reward[itemId] = c * count
  527 + end
  528 + for i = 1, count do
  529 + local chance = bonusData.chance:randWeight(true)
  530 + if chance[1] ~= 0 then
  531 + reward[chance[1]] = (reward[chance[1]] or 0) + chance[2]
  532 + end
  533 + end
  534 + if open and actData then
  535 + for k, v in pairs(reward) do
  536 + reward[k] = v * (actData.condition > 1 and actData.condition or 1)
  537 + end
  538 + end
  539 + end
  540 +
  541 + reward, change = role:award(reward, {log = {desc = "bonusBattle", int1 = bonusData.id}})
  542 + role:checkTaskEnter("BonusPass", {id = bonusData.id, count = count})
  543 + return reward, change
541 544 end
542 545  
543 546 function _M.startBonusBattleRpc(agent, data)
... ... @@ -557,25 +560,26 @@ function _M.startBonusBattleRpc(agent, data)
557 560 end
558 561  
559 562 if not bonusData then return 3 end
560   - if not role:checkHangPass(bonusData.unlock) then return 4 end
  563 + local bonusStar = role:getProperty("bonusStar")
561 564  
562   - local bonusC = role.dailyData:getProperty("bonusC")
563   - bonusC[bonusData.type] = bonusC[bonusData.type] or {c = 0, b = 0}
  565 + if bonusData.unlock ~= 0 and (not bonusStar[bonusData.unlock] or bonusStar[bonusData.unlock] == 0) then return 4 end
564 566  
565   - local actData = csvdb["activity_ctrlCsv"][actId]
  567 + if bonusStar[id] and bonusStar[id] >= (1 << #bonusData.sweep_condition:toTableArray(true)) - 1 then
  568 + local bonusC = role.dailyData:getProperty("bonusC")
  569 + bonusC[bonusData.type] = bonusC[bonusData.type] or {c = 0, b = 0}
  570 +
  571 + local actData = csvdb["activity_ctrlCsv"][actId]
  572 + local extraCnt = role.storeData:getBonusExtraFightCount()
  573 + local coef = 1
  574 + if open and actData then
  575 + coef = tonumber(actData.condition2)
  576 + end
  577 + if math.illegalNum(count, 1, globalCsv.bonus_daily_count * coef + extraCnt - bonusC[bonusData.type]["c"]) then return 7 end
566 578  
567   - local extraCnt = role.storeData:getBonusExtraFightCount()
568   - local coef = 1
569   - if open and actData then
570   - coef = tonumber(actData.condition2)
571   - end
572   -
573   - if math.illegalNum(count, 1, globalCsv.bonus_daily_count * coef + extraCnt - bonusC[bonusData.type]["c"]) then return 7 end
  579 + bonusC[bonusData.type]["c"] = bonusC[bonusData.type]["c"] + count
  580 + role.dailyData:updateProperty({field = "bonusC", value = bonusC})
574 581  
575   - local bonusStar = role:getProperty("bonusStar")
576   - if bonusStar[id] and bonusStar[id] >= (1 << #bonusData.sweep_condition:toTableArray(true)) - 1 then
577   - local status, reward, change = bonusWinReward(role, bonusData, nil, count)
578   - if not status then return 10 * (reward or 0) end
  582 + local reward, change = bonusWinReward(role, bonusData, 3, count)
579 583 SendPacket(actionCodes.Hang_startBonusBattleRpc, MsgPack.pack({reward = reward, change = change}))
580 584 else
581 585 local bTeam = role:getTeamFormatByType(TeamSystemType.BonusBattle)
... ... @@ -605,15 +609,16 @@ function _M.endBonusBattleRpc(agent, data)
605 609 end
606 610 local bonusData = csvdb["bonus_battleCsv"][id]
607 611  
608   - local reward, change
  612 + local reward, change = {}
609 613  
610 614 local bonusStar = role:getProperty("bonusStar")
  615 + local oldStar = bonusStar[id] or 0
611 616 local curStar = 0
612 617 if starNum and starNum > 0 then
613 618 -- 胜利扣除次数
614 619  
615 620 local bTeam = role:getTeamFormatByType(TeamSystemType.BonusBattle)
616   - local herosInfo = role:getTeamHerosInfo(bTeam.heros)
  621 + local herosInfo = role:getTeamHerosInfo(bTeam).heros
617 622  
618 623 local check = {}
619 624 -- 1 通关
... ... @@ -671,12 +676,23 @@ function _M.endBonusBattleRpc(agent, data)
671 676 end
672 677 end
673 678 local status
674   - status, reward, change = bonusWinReward(role, bonusData, curStar >= (1 << #sweepConds) - 1)
675   - if not status then return 10 + (reward or 0) end
  679 + local rewardType = 0
  680 + if curStar >= (1 << #sweepConds) - 1 then -- 满星
  681 + rewardType = 2
  682 + if oldStar == 0 then --通关
  683 + rewardType = 4
  684 + end
  685 + elseif oldStar == 0 then --通关
  686 + rewardType = 1
  687 + end
  688 +
  689 + if rewardType ~= 0 then
  690 + reward, change = bonusWinReward(role, bonusData, rewardType)
  691 + end
676 692 else
677   - curStar = 0
  693 + curStar = oldStar
678 694 end
679   - if curStar ~= bonusStar[id] then
  695 + if curStar ~= oldStar then
680 696 bonusStar[id] = curStar
681 697 role:updateProperty({field = "bonusStar", value = bonusStar})
682 698 end
... ...
src/actions/HeroAction.lua
... ... @@ -146,7 +146,9 @@ function _M.talentRpc(agent, data)
146 146 local talent = hero:getProperty("talent")
147 147 local heroCfgId = hero:getProperty("type")
148 148 local curStage = talent:getv(0, 1)
  149 + local oldStage = curStage
149 150 local curLevel = talent:getv(1, 1)
  151 + local oldLevel = curLevel
150 152 local curData = csvdb["unit_talent_"..heroCfgId.."Csv"][curStage]
151 153 if not curData then return 1 end
152 154 local oldSkillLv = hero:getSkillLevel(1)
... ... @@ -174,13 +176,16 @@ function _M.talentRpc(agent, data)
174 176  
175 177 hero:updateProperty({field = "talent", value = talent})
176 178  
  179 +
177 180 role:log("hero_talent", {
178 181 hero_id = hero:getProperty("type"), --英雄ID
179   - hero_talent_id = curStage, --天赋ID
180   - hero_talent_cost = cost, -- 英雄天赋升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
181   - hero_talent_levelbef = oldSkillLv, -- 英雄技能升级前等级
182   - hero_talent_level = hero:getSkillLevel(1), -- 英雄技能升级后等级
  182 + hero_talent_stagebef = oldStage, --英雄精进升级前停留阶段
  183 + hero_talent_stage = curStage, --英雄精进升级后停留阶段
  184 + hero_talent_cost = cost, --英雄精进升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,….}
  185 + hero_talent_subid = curData[oldLevel].effect, --升级属性ID,生命、攻击、防御、命中、闪避分别对应(0,1,2,3,4)
  186 + hero_talent_sublevel = curData[oldLevel].level, --升级属性等级,如生命升级从1到2,则记录2
183 187 })
  188 +
184 189 hero:mylog({desc = "talent", int1 = talent:getv(0, 1), int2 = talent:getv(1, 1)})
185 190  
186 191 SendPacket(actionCodes.Hero_talentRpc, '')
... ... @@ -447,7 +452,6 @@ function _M.referEquipsRpc(agent, data)
447 452 end
448 453 end
449 454  
450   - local oldAttr = hero:getTotalAttrs()
451 455 local oldBattleV = hero:getProperty("battleV")
452 456 local wear = {}
453 457  
... ... @@ -477,16 +481,14 @@ function _M.referEquipsRpc(agent, data)
477 481 -- 更新角色
478 482 hero:updateProperty({field = "equip", value = curEquip})
479 483  
480   - local curAttr = hero:getTotalAttrs()
481   - local attrChange = getChangeAttrJson(oldAttr, curAttr)
482 484 for typ, data in pairs(wear) do
483 485 role:log("equip_wear", {
484 486 hero_id = hero:getProperty("type"), --英雄ID
485 487 equip_id = data.id, --装备ID
486 488 equip_wear_action = data.act, --装备操作类型:装备:0,卸载:1
487 489 equip_wear_part = typ, --装备部位,记录部位ID
488   - equip_wear_result = curAttr, --装备操作后结果,记录属性变化,json格式记录,{“aa”:1234,"bb":4567}
489   - equip_wear_change = attrChange, --装备操作变化值,记录属性变化,记录正负值,json格式记录,{“aa”:1234,"bb":-45}
  490 + equip_wear_scorebef = oldBattleV, --装备前英雄评分
  491 + equip_wear_score = hero:getProperty("battleV"), --装备后英雄评分
490 492 equip_wear_mode = isAuto and 0 or 1, --用以区分自动装备还是手动装备,自动记录为0,手动记录为1
491 493 })
492 494 end
... ... @@ -712,6 +714,7 @@ end
712 714 function _M.drawHeroRpc(agent, data)
713 715 local role = agent.role
714 716 local msg = MsgPack.unpack(data)
  717 + local actid = msg.actid
715 718  
716 719 if not role:isFuncUnlock(FuncUnlock.GetHero) then return 1 end
717 720 local btype = msg.pool -- 1 2 3 4 5 卡池类型 4新手卡池 5心愿卡池
... ... @@ -721,14 +724,38 @@ function _M.drawHeroRpc(agent, data)
721 724 subType = 1
722 725 if btype == 4 and role:getProperty("newerDraw") >= 10 then
723 726 subType = 2
  727 + if(role:getProperty("newerDraw") >= 30) then
  728 + return 30
  729 + end
724 730 end
725 731 end
726 732  
  733 + -- 另开活动卡池
  734 + if actid then
  735 + if not role.activity:isOpenById(actid, "ActHeroPool") then return end
  736 + local cfg = csvdb["activity_ctrlCsv"][actid]
  737 + if not cfg then return end
  738 +
  739 + btype = cfg.condition
  740 + end
  741 +
727 742 if btype == 1 then
728 743 -- 判断定向卡池活动开启
729 744 if not role.activity:isOpen("RaceDraw") then
730 745 return
731 746 end
  747 + elseif btype == 2 then
  748 + if role:getProperty("newerGuide") ~= "8=1" then
  749 + -- 判断普通卡池
  750 + if role.activity:isOpen("WishHeroPool") then
  751 + return
  752 + end
  753 + end
  754 + elseif btype == 5 then
  755 + -- 判断心愿单卡池
  756 + if not role.activity:isOpen("WishHeroPool") then
  757 + return
  758 + end
732 759 end
733 760  
734 761 local buildTypeData = csvdb["build_typeCsv"][btype]
... ... @@ -945,16 +972,21 @@ function _M.drawHeroRpc(agent, data)
945 972 gacha_up = 0, -- 卡池UP角色
946 973 gacha_times = drawCount[drawType], -- 抽卡次数
947 974 gacha_reward = logReward, -- 抽卡结果,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
948   - currency = cost, -- 购买道具消耗的货币
  975 + gacha_cost = cost, -- 购买道具消耗的货币
949 976 gacha_cnt = floorHeroCount,
950 977 })
951 978 SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组
952 979  
953   - if btype == 1 or btype == 2 then
  980 + local feedbackId = buildTypeData["can_feedback"] or 0
  981 + if feedbackId ~= 0 then
954 982 -- 达到一定次数,给响应奖励
955 983 local oldVal = role:getProperty("repayHero") or 0
  984 + if actid then
  985 + local actData = role.activity:getActData("ActHeroPool")
  986 + oldVal = actData[btype] or 0
  987 + end
956 988 local newVal = oldVal + drawCount[drawType]
957   - local drawCardReward, val = role:getDrawCardExtraReward(oldVal, newVal)
  989 + local drawCardReward, val = role:getDrawCardExtraReward(feedbackId, oldVal, newVal)
958 990 -- 空字符穿代表直接给英雄 走以前repayHeroRpc
959 991 if drawCardReward == "" then
960 992 local repayHeroMaxCount = role:getProperty("repayMaxC") or 0
... ... @@ -964,11 +996,11 @@ function _M.drawHeroRpc(agent, data)
964 996 local even = repayHeroMaxCount % 2
965 997 local id = 0
966 998 if even == 1 then
967   - id = math.randWeight(csvdb["build_giftCsv"], "pool_1")
  999 + id = math.randWeight(csvdb["build_giftCsv"], "pool_"..feedbackId)
968 1000 else
969 1001 local giftHeroSet = {}
970 1002 for gid, cfg in pairs(csvdb["build_giftCsv"]) do
971   - if cfg["pool_1"] ~= 0 and not role:isHaveHero(gid - ItemStartId.Hero) then
  1003 + if cfg["pool_"..feedbackId] ~= 0 and not role:isHaveHero(gid - ItemStartId.Hero) then
972 1004 giftHeroSet[gid] = {1}
973 1005 end
974 1006 end
... ... @@ -977,7 +1009,7 @@ function _M.drawHeroRpc(agent, data)
977 1009 end
978 1010 end
979 1011 if id == 0 then
980   - id = math.randWeight(csvdb["build_giftCsv"], "pool_1")
  1012 + id = math.randWeight(csvdb["build_giftCsv"], "pool_"..feedbackId)
981 1013 end
982 1014  
983 1015 local r,change = {}
... ... @@ -997,7 +1029,13 @@ function _M.drawHeroRpc(agent, data)
997 1029 r, change = role:award(drawCardReward, {log = {desc = "drawHeroExtraReward", int1 = oldVal, int2 = newVal}})
998 1030 SendPacket(actionCodes.Hero_drawHeroExtraRewardNtf, MsgPack.pack(role:packReward(r, change)))
999 1031 end
1000   - role:updateProperty({field = "repayHero", value = val})
  1032 + if not actid then
  1033 + role:updateProperty({field = "repayHero", value = val})
  1034 + else
  1035 + local actData = role.activity:getActData("ActHeroPool")
  1036 + actData[btype] = val
  1037 + role.activity:updateActData("ActHeroPool", actData)
  1038 + end
1001 1039 end
1002 1040 return true
1003 1041 end
... ...
src/actions/HttpAction.lua
... ... @@ -187,6 +187,9 @@ function _M.online(query)
187 187 return count
188 188 end
189 189  
  190 +function _M.dbqlen(query)
  191 + return skynet.call(redisd, "debug", "INFO")
  192 +end
190 193  
191 194 function _M.account_init(query, body)
192 195 if not query.id or not body or body == "" then return "指令不存在" end
... ...
src/actions/PvpAction.lua
... ... @@ -135,7 +135,7 @@ local function getMatchInfo(role, pvpList, battleCache, dbKey, infoFuncName, inf
135 135 if k == "battleInfo" then
136 136 battleCache[curInfo.roleId] = v
137 137 else
138   - if (k == "heros" or k == "battleV") and infoCache then
  138 + if (k == "team" or k == "battleV") and infoCache then
139 139 infoCache[curInfo.roleId] = infoCache[curInfo.roleId] or {}
140 140 infoCache[curInfo.roleId][k] = v
141 141 end
... ... @@ -705,12 +705,12 @@ function _M.endBattleHRpc(agent, data)
705 705 info.winId = info.isWin and roleId or match.id
706 706 info.isWin = nil
707 707 selfTeam[_idx] = {
708   - heros = role:getTeamHerosInfo(_pvpStartBattleCacheH.pvpTH[_idx].heros),
  708 + team = role:getTeamHerosInfo(_pvpStartBattleCacheH.pvpTH[_idx]),
709 709 battleV = role:getTeamBattleValue(_pvpStartBattleCacheH.pvpTH[_idx].heros)
710 710 }
711 711 if match.t == 1 and _pvpStartBattleCacheH.enemyT then
712 712 enemyTeam[_idx] = {
713   - heros = _pvpStartBattleCacheH.enemyT["heros"][_idx],
  713 + team = _pvpStartBattleCacheH.enemyT["team"][_idx],
714 714 battleV = _pvpStartBattleCacheH.enemyT["battleV"][_idx]
715 715 }
716 716 end
... ...
src/actions/RadioAction.lua
... ... @@ -101,7 +101,26 @@ function _M.startQuestRpc(agent, data)
101 101 radioTask[id] = taskData
102 102 role:updateProperty({field="radioTask", value=radioTask, notNotify=true})
103 103  
104   - SendPacket(actionCodes.Radio_startQuestRpc, MsgPack.pack({id=id, task=taskData}))
  104 + SendPacket(actionCodes.Radio_startQuestRpc, MsgPack.pack({id=id, task=taskData}))
  105 +
  106 + local herolist = {}
  107 + for _, heroId in ipairs(heros) do
  108 + local hero = role.heros[heroId]
  109 + if hero then
  110 + table.insert(herolist, hero:getProperty("type"))
  111 + end
  112 + end
  113 +
  114 + -- 讨伐行动
  115 + role:log("punitive_action", {
  116 + mission_id = id, --关卡ID
  117 + mission_herolist = herolist, -- 英雄ID,排序以玩家出战设置为准,示例:[111, 222, 333, 444, 555]
  118 + mission_success_rate = 0, -- 大成功几率
  119 + mission_reward = {}, -- 获得奖励,建议使用json格式记录。示例:{ itemid1: 1, itemid2: 3, itemid3: 5}
  120 + mission_result = 0, -- 战斗结果(0-无效,1-胜利,2-失败)
  121 + mission_roundtime = 0, -- 完成耗时(秒)
  122 + mission_cleartype = 1, -- 1-开始; 2-完成(领取奖励时)
  123 + })
105 124 return true
106 125 end
107 126  
... ... @@ -158,7 +177,28 @@ function _M.finishQuestRpc(agent, data)
158 177 msg["big"] = bigSuccess
159 178 msg["id"] = id
160 179 msg["heroFaith"] = heroFaithMap
161   - SendPacket(actionCodes.Radio_finishQuestRpc, MsgPack.pack(msg))
  180 + SendPacket(actionCodes.Radio_finishQuestRpc, MsgPack.pack(msg))
  181 +
  182 +
  183 + local herolist = {}
  184 + for _, heroId in ipairs(task.heros) do
  185 + local hero = role.heros[heroId]
  186 + if hero then
  187 + table.insert(herolist, hero:getProperty("type"))
  188 + end
  189 + end
  190 +
  191 + -- 讨伐行动
  192 + role:log("punitive_action", {
  193 + mission_id = id, --关卡ID
  194 + mission_herolist = herolist, -- 英雄ID,排序以玩家出战设置为准,示例:[111, 222, 333, 444, 555]
  195 + mission_success_rate = totalCoef, -- 大成功几率
  196 + mission_reward = r, -- 获得奖励,建议使用json格式记录。示例:{ itemid1: 1, itemid2: 3, itemid3: 5}
  197 + mission_result = 1, -- 战斗结果(0-无效,1-胜利,2-失败)
  198 + mission_roundtime = config.time, -- 完成耗时(秒)
  199 + mission_cleartype = 2, -- 1-开始; 2-完成(领取奖励时)
  200 + })
  201 +
162 202 return true
163 203 end
164 204  
... ...
src/actions/RoleAction.lua
... ... @@ -300,6 +300,7 @@ function _M.loginRpc( agent, data )
300 300 if msg.newdevice then
301 301 role:mylog("newdevice", {key1 = agent.ip:toArray(false, ":")[1]})
302 302 end
  303 +
303 304 return true
304 305 end
305 306  
... ... @@ -372,6 +373,38 @@ function _M.createRpc(agent, data)
372 373 end
373 374  
374 375 SendPacket(actionCodes.Role_createRpc, MsgPack.pack(response))
  376 +
  377 + -- cb付费返利
  378 + skynet.timeout(0, function()
  379 + local cbbackd = cluster.query("center", "cbbackd")
  380 + local uid = newRole:getProperty("uid")
  381 + local start = uid:find("_")
  382 + if start then
  383 + uid = uid:sub(start + 1)
  384 + end
  385 + if cbbackd then
  386 + local status, back = pcall(cluster.call, "center", cbbackd, "getCbBack", {uid = uid, id = roleId})
  387 + if status then
  388 + if back and next(back) and back.reward and next(back.reward) then
  389 + local reward = ""
  390 + for itemId, count in pairs(back.reward) do
  391 + reward = reward:setv(itemId, count)
  392 + end
  393 + if back.reward[70] then
  394 + redisproxy:insertEmail({roleId = roleId, emailId = MailId.CBBackAward2, contentPms = {back.money}, createtime = skynet.timex(), attachments = reward})
  395 + else
  396 + redisproxy:insertEmail({roleId = roleId, emailId = MailId.CBBackAward, contentPms = {back.money}, createtime = skynet.timex(), attachments = reward})
  397 + end
  398 + newRole:mylog("cbback", {key1 = uid, int2 = roleId})
  399 + end
  400 + else
  401 + skynet.error("[ERROR] cbbackd cant call center uid: " .. uid .. " roleId:" .. roleId)
  402 + end
  403 + else
  404 + skynet.error("[ERROR] cbbackd cant call center uid: " .. uid .. " roleId:" .. roleId)
  405 + end
  406 + end)
  407 +
375 408 return true
376 409 end
377 410  
... ... @@ -537,82 +570,132 @@ function _M.openTimeBoxRpc(agent, data)
537 570 local slot = msg.slot -- 位置 1 - 6
538 571  
539 572 -- 特权卡时间箱额外栏位
540   - local privExtraCnt = role.storeData:getTimeBoxSlotExtraCount()
541   - if oper == 1 then
542   - if math.illegalNum(slot, 1, role:getFuncLv(FuncOpenType.TimeBoxSlot) + privExtraCnt) then return end
543   - end
  573 + -- local privExtraCnt = role.storeData:getTimeBoxSlotExtraCount()
  574 + -- if oper == 1 then
  575 + -- if math.illegalNum(slot, 1, role:getFuncLv(FuncOpenType.TimeBoxSlot) + privExtraCnt) then return end
  576 + -- end
544 577  
545 578 local boxL = role:getProperty("boxL")
546   - local reward, change = {}
547   - if oper == 1 then -- 打开
  579 + local reward, change
  580 + if oper == 1 then -- 构建开始(包括切换构建的id)
548 581 local itemId = msg.itemId
549   - if role:getItemCount(itemId) < 1 then return end
550 582 local itemData = csvdb["itemCsv"][itemId]
551   - local randomData = csvdb["item_randomCsv"][itemId]
552   - if not itemData or not randomData or randomData.openTime <= 0 then return end
553   -
554   - if boxL[slot] then return end
555   - role:costItems({[itemId] = 1}, {log = {desc = "openTimeBox"}})
556   - boxL[slot] = {id = itemId, time = skynet.timex() + randomData.openTime}
557   - role:pushMsg({type = "box", slot = slot, time = randomData.openTime})
558   - elseif oper == 2 then -- 领取
  583 + if not itemData then return 1 end
  584 + if not boxL[slot] then
  585 + boxL[slot] = {}
  586 + else
  587 + local oldId, process, time = boxL[slot].id, boxL[slot].process, boxL[slot].time
  588 + local unitTime = globalCsv.box_key_time[oldId] * 60
  589 + local doneCnt = math.floor((process + skynet.timex() - time) / unitTime)
  590 + if doneCnt > 0 then
  591 + reward = role:award({[oldId] = doneCnt}, {log = {desc = "openTimeBox", int1 = slot}})
  592 + end
  593 + end
  594 + local limit = globalCsv.box_key_max[itemId] or 5
  595 + if role:getItemCount(itemId) >= limit then return 3 end
  596 +
  597 + boxL[slot] = {id = itemId, process = 0, time = skynet.timex()}
  598 + role:pushMsg({type = "box", slot = slot, time = skynet.timex() + globalCsv.box_productLine_time * 3600})
  599 + elseif oper == 2 then -- 重置运行时间(可以使用加速)
559 600 local quick = msg.quick
560   - if not boxL[slot] then return end
561   - local costKey = 0
562   - if boxL[slot].time > skynet.timex() then -- 没开完
563   - if not quick then return end
  601 + if not boxL[slot] then return 4 end
  602 +
  603 + local itemId, process, time = boxL[slot].id, boxL[slot].process, boxL[slot].time
  604 + local nowTime = skynet.timex()
  605 + local stopTime = nowTime
  606 + local itemData = csvdb["itemCsv"][itemId]
  607 + local unitTime = globalCsv.box_key_time[itemId] * 60
  608 + if quick then
  609 + stopTime = time + globalCsv.box_productLine_time * 3600
564 610 local cost_pre = globalCsv.box_timeOpen_diamond:toArray(true, "=")
565   - costKey = math.ceil((boxL[slot].time - skynet.timex()) / (cost_pre[1] * 60)) * cost_pre[2]
566   - if not role:checkItemEnough({[ItemId.BoxKey] = costKey}) then return end
567   - role:costItems({[ItemId.BoxKey] = costKey}, {log = {desc = "openTimeBox"}})
568   - role:pushCancel({type = "box", slot = slot})
  611 + local costKey = math.ceil((stopTime - nowTime) / (cost_pre[1] * 60)) * cost_pre[2]
  612 + if not role:checkItemEnough({[ItemId.Diamond] = costKey}) then return 5 end
  613 + role:costItems({[ItemId.Diamond] = costKey}, {log = {desc = "openTimeBox", int1 = slot}})
  614 + else
  615 + stopTime = math.min(nowTime,time + globalCsv.box_productLine_time * 3600)
  616 + end
  617 + role:pushCancel({type = "box", slot = slot})
  618 +
  619 + local doneCnt = math.floor((process + stopTime - time) / unitTime)
  620 + if doneCnt > 0 then
  621 + reward = role:award({[itemId] = doneCnt}, {log = {desc = "openTimeBox", int1 = slot}})
  622 + end
  623 + if role:getItemCount(itemId) >= globalCsv.box_key_max[itemId] then
  624 + nowTime = 0
  625 + end
  626 +
  627 + boxL[slot] = {id = itemId, process = (process + stopTime - time) % unitTime, time = nowTime}
  628 + role:pushMsg({type = "box", slot = slot, time = nowTime + globalCsv.box_productLine_time * 3600})
  629 + elseif oper == 3 then -- 开箱子
  630 + local costId = msg.costId
  631 + local costs = (msg.costs or ""):toNumMap()
  632 + if not costId or not csvdb["itemCsv"][costId] or not next(costs) then return 6 end
  633 +
  634 + local costIdData = csvdb["itemCsv"][costId]
  635 + local count = 0
  636 + for itemId, num in pairs(costs) do
  637 + local itemIdData = csvdb["itemCsv"][itemId]
  638 + if not itemIdData or not csvdb["item_randomCsv"][itemId] or costIdData.quality ~= itemIdData.quality then return 7 end
  639 + count = count + num
569 640 end
570   - local boxId = boxL[slot].id
571   - local itemData = csvdb["itemCsv"][boxId]
572   - local randomData = csvdb["item_randomCsv"][itemData.id]
573   - local costTime = skynet.timex() - (boxL[slot].time - randomData.openTime)
574   - -- 随机奖励
  641 +
  642 + if role:getItemCount(costId) < count then return 8 end
  643 + if not role:checkItemEnough(costs) then return 9 end
  644 +
  645 + role:costItems({[costId] = count}, {log = {desc = "openTimeBox"}})
  646 +
575 647 reward = {}
576   - for i = 1, 10 do
577   - local num = randomData["num" .. i]
578   - local gift = randomData["gift" .. i]
579   - if num and gift and num > 0 and gift ~= "" then
580   - local pool = {}
581   - for _, temp in ipairs(gift:toArray()) do
582   - local set = temp:toArray(true, "=")
583   - table.insert(pool, set)
  648 + for itemId, value in pairs(costs) do
  649 + local tempReward = {}
  650 + local randomData = csvdb["item_randomCsv"][itemId]
  651 + local itemData = csvdb["itemCsv"][itemId]
  652 + role:costItems({[itemId] = value}, {log = {desc = "openTimeBox"}})
  653 + for _ = 1, value do
  654 + for i = 1, 10 do
  655 + local num = randomData["num" .. i]
  656 + local gift = randomData["gift" .. i]
  657 + if num and gift and num > 0 and gift ~= "" then
  658 + local pool = {}
  659 + for _, temp in ipairs(gift:toArray()) do
  660 + local set = temp:toArray(true, "=")
  661 + table.insert(pool, set)
  662 + end
  663 +
  664 + local needCount = math.min(#pool, num)
  665 + for j = 1, needCount do
  666 + local idx = math.randWeight(pool, 3)
  667 + tempReward[pool[idx][1]] = (tempReward[pool[idx][1]] or 0) + pool[idx][2]
  668 + table.remove(pool, idx)
  669 + end
  670 + end
584 671 end
  672 + end
  673 + tempReward[0] = nil
  674 + role:checkTaskEnter("OpenBox", {id = itemId, count=value, quality=itemData.quality})
  675 + role:log("carriage_dismantle", {
  676 + item_id = itemId, -- 道具id
  677 + item_type = itemData.type, -- 道具类型,具体见枚举表中道具类型枚举表
  678 + item_level = 0, -- 道具等级
  679 + item_number = 1, -- 道具变化数量的绝对值
  680 + carriage_dismantle_type = 1, -- 拆解方式,时间到期:0,钥匙开启:1
  681 + carriage_dismantle_time = 0, -- 拆解耗时,填写实际耗时
  682 + carriage_dismantle_cost = value, -- 拆解花费钥匙数量,未使用填写0
  683 + carriage_dismantle_rwd = tempReward, -- 拆解获得物资,json格式记录,{'itemid1':2,'itemid2':3,…………..}
  684 + })
585 685  
586   - local needCount = math.min(#pool, num)
587   - for j = 1, needCount do
588   - local idx = math.randWeight(pool, 3)
589   - reward[pool[idx][1]] = (reward[pool[idx][1]] or 0) + pool[idx][2]
590   - table.remove(pool, idx)
591   - end
  686 + for id, num in pairs(tempReward) do
  687 + reward[id] = (reward[id] or 0) + num
592 688 end
593 689 end
594   - reward[0] = nil
595   -
596   - boxL[slot] = nil
597   - reward, change = role:award(reward, {log = {desc = "openTimeBox", int1 = boxId}})
598   - role:checkTaskEnter("OpenBox", {id = boxId, count=1, quality=itemData.quality})
599   -
600   - role:log("carriage_dismantle", {
601   - item_id = boxId, -- 道具id
602   - item_type = itemData.type, -- 道具类型,具体见枚举表中道具类型枚举表
603   - item_level = 0, -- 道具等级
604   - item_number = 1, -- 道具变化数量的绝对值
605   - carriage_dismantle_type = quick and 1 or 0, -- 拆解方式,时间到期:0,钥匙开启:1
606   - carriage_dismantle_time = costTime, -- 拆解耗时,填写实际耗时
607   - carriage_dismantle_cost = costKey, -- 拆解花费钥匙数量,未使用填写0
608   - carriage_dismantle_rwd = reward, -- 拆解获得物资,json格式记录,{'itemid1':2,'itemid2':3,…………..}
609   - })
  690 + reward, change = role:award(reward, {log = {desc = "openTimeBox", int1 = costId}})
610 691 else
611 692 return
612 693 end
613 694  
614   - role:setProperty("boxL") --刷新
615   - role:changeUpdates({{type = "boxL", field = slot, value = boxL[slot], isOnlyToC = true}}) -- 通知客户端
  695 + role:setProperty("boxL",boxL) --刷新
  696 + if slot then
  697 + role:changeUpdates({{type = "boxL", field = slot, value = boxL[slot], isOnlyToC = true}}) -- 通知客户端
  698 + end
616 699 SendPacket(actionCodes.Role_openTimeBoxRpc, MsgPack.pack(role:packReward(reward, change)))
617 700 return true
618 701 end
... ... @@ -724,11 +807,12 @@ function _M.unLockStoryBookRpc(agent, data)
724 807 local storyStatus = role:getProperty("storyB")
725 808 if storyStatus[storyId] and storyStatus[storyId].s then return end --不需要解锁
726 809  
727   - local cost = storyBookData.lockItem:toNumMap()
728   - if not cost or not next(cost) then return end
729   - if not role:checkItemEnough(cost) then return end -- 消耗品不足
730   -
731   - role:costItems(cost, {log = {desc = "unlockStory", int1 = storyId}})
  810 + if storyBookData.lockItem ~= "free" then
  811 + local cost = storyBookData.lockItem:toNumMap()
  812 + if not cost or not next(cost) then return end
  813 + if not role:checkItemEnough(cost) then return end -- 消耗品不足
  814 + role:costItems(cost, {log = {desc = "unlockStory", int1 = storyId}})
  815 + end
732 816  
733 817 -- 解锁
734 818 storyStatus[storyId] = storyStatus[storyId] or {}
... ... @@ -807,6 +891,12 @@ function _M.taskActiveRpc(agent, data)
807 891 { type = roleField[taskType], field = {"at", taskId}, value = -1 }
808 892 })
809 893  
  894 + role:log("task_reward", {
  895 + task_reward_id = taskId * 100 + taskType, --任务奖励ID
  896 + task_reward_type = 3, --任务奖励类型,见 任务奖励类型枚举表
  897 + task_reward_detail = reward, --任务奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
  898 + })
  899 +
810 900 SendPacket(actionCodes.Role_taskActiveRpc, MsgPack.pack(role:packReward(reward, change)))
811 901 return true
812 902 end
... ...
src/actions/StoreAction.lua
... ... @@ -13,6 +13,9 @@ function _M.rechargeRpc(agent , data)
13 13  
14 14 --创建订单号
15 15 local partnerOrderId = role:getPurchaseOrder(id)
  16 + if partnerOrderId == "" then
  17 + return 1
  18 + end
16 19 SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ order = partnerOrderId }))
17 20  
18 21 if true then return end
... ...
src/adv/Adv.lua
... ... @@ -149,25 +149,15 @@ function Adv:initByChapter(params)
149 149 self.maps = {}
150 150 self.maps[1] = AdvMap.new(self, 1, mapId, isEnter, isNewRelay)
151 151  
152   - self:initBattle(nil)
  152 + self:initBattle(nil, isToNext)
153 153  
154 154 self:initLayerTask()
155 155  
156   - -- 支援效果生效一些
157   - self:activeSomeSupport()
  156 +
158 157  
159 158 self:checkTask(Adv.TaskType.Arrive)
160 159 self:checkAdvUnlock(1, self.level)
161 160  
162   - if isToNext then
163   - self.battle.player:afterLayer() -- 玩家的buff 清理一下
164   - end
165   -
166   - -- 不是中继层 加上 层 和 地图的buff和被动
167   - if not self.isRelay then
168   - self.battle:initMapEffect()
169   - end
170   -
171 161 -- 中继进入奖励
172 162 if relayData and isEnter then
173 163 self:awardRelay(relayData, notNotify)
... ... @@ -456,8 +446,20 @@ function Adv:clearAdvUnlockCache()
456 446 self.cacheUnlock = {}
457 447 end
458 448  
459   -function Adv:initBattle(info)
  449 +function Adv:initBattle(info, isToNext)
460 450 self.battle = require("adv.AdvBattle").new(self)
  451 + -- 支援效果生效一些
  452 + self:activeSomeSupport()
  453 +
  454 + -- 不是中继层 加上 层 和 地图的buff和被动
  455 + if not self.isRelay then
  456 + self.battle:initMapEffect()
  457 + end
  458 +
  459 + if isToNext then
  460 + self.battle.player:afterLayer() -- 玩家的buff 清理一下
  461 + end
  462 +
461 463 for _, passiveC in ipairs(self.cachePassiveEvent or {}) do
462 464 self.battle:triggerPassive(passiveC[1], passiveC[2])
463 465 end
... ... @@ -468,7 +470,7 @@ function Adv:initBattle(info)
468 470 map:initBattleAfter()
469 471 end
470 472 --下层
471   - if not info and self.level ~= 1 then
  473 + if not info and isToNext then
472 474 self.battle.player:attrChangeCondBuffCheck(1)
473 475 end
474 476  
... ... @@ -820,7 +822,7 @@ function Adv:over(success, rewardRatio, overType)
820 822 lv = self.owner:getProperty("level"),
821 823 batteV = self.owner:getTeamBattleValue(team.heros),
822 824 chapter = self.chapterId,
823   - format = self.owner:getTeamHerosInfo(team.heros),
  825 + format = self.owner:getTeamHerosInfo(team).heros,
824 826 }
825 827 redisproxy:pipelining(function (red)
826 828 red:zadd(self.owner:getAdvRankKey(), score, roleId) --更新分数
... ... @@ -1094,10 +1096,10 @@ local function clickOut(self, room, block, params, isExit)
1094 1096 end
1095 1097  
1096 1098 if #self.mapStack > 1 then -- 处于夹层中
  1099 + self:backLayer(-1)
1097 1100 local oldMapIdx = self:getCurMapIdx()
1098 1101 table.remove(self.mapStack) --退出夹层
1099 1102 self.battle:iLayerChange(oldMapIdx)
1100   - self:backLayer(-1)
1101 1103 else --处于底层
1102 1104  
1103 1105 local advPass = self.owner:getProperty("advPass")
... ... @@ -1129,8 +1131,8 @@ local function clickOut(self, room, block, params, isExit)
1129 1131 if curFloorData then
1130 1132 self:award({[ItemId.AdvPoint] = curFloorData.exp}, {log = {desc = "passReward", int1 = self.chapterId, int2 = self.level}}, {})
1131 1133 end
  1134 + self:backNext() --下一关
1132 1135 local isHaveRelay = self:isHaveRelay(self.level)
1133   -
1134 1136 if isHaveRelay and not self.isRelay then
1135 1137 self:initByChapter({
1136 1138 chapterId = self.chapterId,
... ... @@ -1148,7 +1150,6 @@ local function clickOut(self, room, block, params, isExit)
1148 1150 notNotify = true,
1149 1151 })
1150 1152 end
1151   - self:backNext() --下一关
1152 1153 end
1153 1154  
1154 1155 end
... ... @@ -1554,6 +1555,7 @@ local function clickBuild(self, room, block, params)
1554 1555 end
1555 1556 advMine[2].co = mineCo2
1556 1557 self.owner:setProperty("advMine", advMine)
  1558 + self.owner:checkTaskEnter("AdvMineLayer")
1557 1559 end
1558 1560  
1559 1561 self:checkTask(Adv.TaskType.Build, 1, oldId)
... ... @@ -1604,6 +1606,7 @@ end
1604 1606  
1605 1607 local function clickLayer(self, room, block, params)
1606 1608 local oldMapIdx = self:getCurMapIdx()
  1609 + self:backLayer(1)
1607 1610 if block.event.mapIdx then
1608 1611 table.insert(self.mapStack, block.event.mapIdx) --进入夹层
1609 1612 else
... ... @@ -1620,7 +1623,6 @@ local function clickLayer(self, room, block, params)
1620 1623 self:checkAchievement(Adv.AchievType.EnterILayer, 1, mapId)
1621 1624 end
1622 1625 self.battle:iLayerChange(oldMapIdx)
1623   - self:backLayer(1)
1624 1626 return true
1625 1627 end
1626 1628  
... ... @@ -2051,6 +2053,7 @@ function Adv:enemyDead(enemy, escape)
2051 2053 advMine[2].co = mineCo2
2052 2054 advMine[2].ch = mineCh
2053 2055 self.owner:setProperty("advMine", advMine)
  2056 + self.owner:checkTaskEnter("AdvMineKill")
2054 2057 else
2055 2058 local toClick = enemy:hadBuff(Buff.CHANGE_DROP_TO_CLICK)
2056 2059 if toClick then
... ...
src/adv/AdvBuff.lua
... ... @@ -35,7 +35,7 @@ Buff.Buff_NO_PASSIVE_MONSTER = 31 -- 地图被动刷新不出来怪物
35 35 Buff.SNEAK = 32 --潜行
36 36 Buff.DROP_BUFF_BY_ENEMY = 33 -- 怪物掉落加成 -- 怪物使用
37 37 Buff.GET_PASSIVE = 34 -- 获得 passive -- 结束失效
38   -Buff.OBSTACLE_CHANGE = 35 -- 看守类型改变 -- 怪物使用 0 - 1
  38 +Buff.OBSTACLE_CHANGE = 35 -- 看守类型改变 -- 怪物使用 2 - 1
39 39 Buff.DISABLE_AURA = 36 -- 禁用光环
40 40 Buff.GET_AURA = 37 -- 获得光环
41 41  
... ...
src/adv/AdvPassive.lua
... ... @@ -9,6 +9,7 @@ Filter.BUFF_BY_ID = 6 -- 指定id的buff
9 9 Filter.CAMP = 7 -- 玩家是指定阵营
10 10 Filter.RANGE = 8 -- 筛选范围 (触发是地块)
11 11 Filter.CLASSIFY = 9 -- 标签
  12 +Filter.NO_BUFF_BY_ID = 10 -- 没有指定id的buff
12 13  
13 14 local FilterFactory = {}
14 15 FilterFactory[Filter.HP_UP_WITH_EQUAL] = function (_Filter)
... ... @@ -47,7 +48,6 @@ FilterFactory[Filter.CAMP] = function (_Filter)
47 48 return role:getHerosCamp(role:getProperty("advTeam").heros) == self.value
48 49 end
49 50 end
50   -
51 51 FilterFactory[Filter.RANGE] = function (_Filter)
52 52 _Filter._execute = function (self, target, params)
53 53 if params and self.owner.blockId and self.owner.roomId and params.blockId and params.roomId then
... ... @@ -57,13 +57,18 @@ FilterFactory[Filter.RANGE] = function (_Filter)
57 57 return false
58 58 end
59 59 end
60   -
61 60 FilterFactory[Filter.CLASSIFY] = function (_Filter)
62 61 _Filter._execute = function (self, target)
63 62 return target.isClassify and target:isClassify(self.value)
64 63 end
65 64 end
66 65  
  66 +FilterFactory[Filter.NO_BUFF_BY_ID] = function (_Filter)
  67 + _Filter._execute = function (self, target)
  68 + return not target:hadBuffById(self.value)
  69 + end
  70 +end
  71 +
67 72 function Filter:ctor(params)
68 73 self.owner = params.owner
69 74 self.skill = params.skill
... ... @@ -87,6 +92,9 @@ function Filter:getTarget(params)
87 92 if self.oType == 2 and params.releaser then
88 93 target = params.releaser
89 94 end
  95 + if self.oType == 3 then
  96 + target = self.owner.battle.player
  97 + end
90 98 return target
91 99 end
92 100  
... ...
src/adv/AdvPlayer.lua
... ... @@ -662,7 +662,7 @@ end
662 662  
663 663 function Enemy:getObstacle()
664 664 local obstacle = csvdb["event_monsterCsv"][self.monsterId].obstacle
665   - if obstacle == 0 and self:hadBuff(Buff.OBSTACLE_CHANGE) then
  665 + if obstacle == 2 and self:hadBuff(Buff.OBSTACLE_CHANGE) then
666 666 obstacle = 1
667 667 end
668 668 return obstacle
... ...
src/agent.lua
... ... @@ -15,6 +15,7 @@ redisproxy = require &quot;shared.redisproxy&quot;
15 15 datacenter = require "skynet.datacenter"
16 16 mcast_util = require "services/mcast_util"
17 17 csvdb = require "shared.csvdata"
  18 +cluster = require "skynet.cluster"
18 19  
19 20 local CMD = {}
20 21 local agentInfo = {} -- { client_fd, role, gate_serv, open_timer}
... ... @@ -364,11 +365,6 @@ skynet.start(function()
364 365 return info
365 366 end)
366 367  
367   - redisd = skynet.localname(".redis")
368   - if tonumber(skynet.getenv "logd") == 1 then
369   - logd = skynet.localname(".log")
370   - end
371   -
372 368 cs = queue()
373 369  
374 370 pvpd = skynet.localname(".pvpcross")
... ...
1   -Subproject commit f019454e533ec12642ab9d7518c80b73c1cc00bb
  1 +Subproject commit ccdf6fcc82fd0a38d1b00bc199baadfd81ec3ab1
... ...
src/main.lua
... ... @@ -2,24 +2,41 @@ local skynet = require &quot;skynet&quot;
2 2  
3 3 local max_client = tonumber(skynet.getenv("max_client"))
4 4 local max_queue = tonumber(skynet.getenv("max_queue"))
  5 +local work_count = tonumber(skynet.getenv("thread"))
  6 +local use_logd = tonumber(skynet.getenv("logd"))
5 7  
6 8 skynet.start(function()
7 9 print("Server start")
8 10 skynet.newservice("debug_console", tonumber(skynet.getenv("debug_port")))
9 11  
10 12  
  13 + -- 启动redis
  14 + for i = 1, work_count do
  15 + local redisd = skynet.newservice("services/redisd", i)
  16 + skynet.call(redisd, "lua", "open", {
  17 + redishost = skynet.getenv("redis_host"),
  18 + redisport = tonumber(skynet.getenv("redis_port")),
  19 + redisdb = tonumber(skynet.getenv("redis_db")),
  20 + auth = skynet.getenv("redis_auth")
  21 + })
  22 + end
  23 +
  24 + --启动log
  25 + if use_logd == 1 then
  26 + for i = 1, work_count * 2 do
  27 + local logd = skynet.newservice("services/logd", i)
  28 + skynet.call(logd, "lua", "open")
  29 + end
  30 + end
  31 +
11 32 local httpd = skynet.newservice("services/httpweb", tonumber(skynet.getenv("httpweb_port")))
12 33 local watchdog = skynet.newservice("services/watchdog", max_client)
13 34  
  35 +
14 36 skynet.call(watchdog, "lua", "start", {
15 37 port = tonumber(skynet.getenv("server_port")),
16 38 maxclient = max_client + max_queue + 10,
17 39 httpd = httpd,
18   -
19   - redishost = skynet.getenv("redis_host"),
20   - redisport = tonumber(skynet.getenv("redis_port")),
21   - redisdb = tonumber(skynet.getenv("redis_db")),
22   - auth = skynet.getenv("redis_auth"),
23 40 })
24 41  
25 42 skynet.exit()
... ...
src/models/Activity.lua
... ... @@ -24,8 +24,13 @@ Activity.ActivityType = {
24 24 Exchange = 18, -- 兑换活动
25 25 HangDrop = 19, -- 挂机掉落活动
26 26 Gachakon = 20, -- 扭蛋活动
27   -}
28 27  
  28 + WishHeroPool = 23, -- 心愿卡池
  29 + ActHeroPool = 24, -- 活动卡池
  30 + ActShopGoods = 25, -- 活动商品
  31 +
  32 + Crisis = 26, -- 宝藏怪活动
  33 +}
29 34  
30 35 local function checkActivityType(activityType)
31 36 if type(activityType) == "string" then
... ... @@ -41,12 +46,19 @@ function Activity:ctor(properties)
41 46 self._isOpen = {}
42 47 end
43 48  
  49 +function Activity:getType(actType)
  50 + if type(actType) == "string" then
  51 + actType = Activity.ActivityType[actType]
  52 + end
  53 + return actType or 0
  54 +end
  55 +
44 56  
45 57 Activity.schema = {
46 58 actime = {"table", {}}, -- 最近检查某项活动的开始时间 {id = time}
47 59 round = {"table", {}}, -- 记录活动到了第几轮 {id = roundnum}
48 60 act4 = {"table", {}}, -- {0 = day, 1= -1, 2 = -1} == 签到活动
49   - act6 = {"table", {}}, -- {1 = 1, 2 = 1} == 付费签到活动
  61 + act6 = {"table", {}}, -- {0 = day, 1 = 1, 2 = 1} == 付费签到活动
50 62 act8 = {"number", 0}, -- 充值返利
51 63  
52 64 act11 = {"table", {}}, -- {0 = 贩卖数量, 1=1, 2=1} 贩卖周活动 1表示领取过该档位的奖励
... ... @@ -58,6 +70,9 @@ Activity.schema = {
58 70 act18 = {"table", {}, true}, -- {id=兑换数量}
59 71 act19 = {"number", 0}, -- {挂机信息}
60 72 act20 = {"table", {}}, -- {id=扭蛋抽出数量}
  73 +
  74 + act24 = {"table", {}, true}, -- 活动卡池 {id=repaynum}
  75 + act26 = {"table", {}}, -- {task = {id = count}, socre = {id = status}}
61 76 }
62 77  
63 78 function Activity:data()
... ... @@ -76,6 +91,7 @@ function Activity:data()
76 91 act18 = self:getProperty("act18"),
77 92 act19 = self:getProperty("act19"),
78 93 act20 = self:getProperty("act20"),
  94 + act26 = self:getProperty("act26"),
79 95 }
80 96 end
81 97  
... ... @@ -153,7 +169,12 @@ function Activity:isOpen(activityType)
153 169 return false
154 170 end
155 171  
156   -function Activity:isOpenById(id)
  172 +function Activity:isOpenById(id, activityType)
  173 + activityType = checkActivityType(activityType)
  174 + local cfg = csvdb["activity_ctrlCsv"][id]
  175 + if not cfg then return false end
  176 + if activityType ~= 0 and cfg.showType ~= activityType then return false end
  177 +
157 178 return self._isOpen[id]
158 179 end
159 180  
... ... @@ -365,6 +386,11 @@ activityFunc[Activity.ActivityType.PaySignIn] = {
365 386 ["init"] = function(self, actType, isCrossDay, notify)
366 387 self:updateActData(actType, {}, not notify)
367 388 end,
  389 + ["crossDay"] = function(self, actType, notify)
  390 + local curData = self:getActData(actType)
  391 + curData[0] = (curData[0] or 0) + 1
  392 + self:updateActData(actType, curData, not notify)
  393 + end,
368 394 ["close"] = function(self, actType, notify)
369 395 self.owner.storeData:SetActGoodsFlag("paySignIn", 0)
370 396  
... ... @@ -473,6 +499,19 @@ activityFunc[Activity.ActivityType.Gachakon] = {
473 499 end,
474 500 }
475 501  
  502 +-- 活动卡池
  503 +activityFunc[Activity.ActivityType.ActHeroPool] = {
  504 + ["init"] = function(self, actType, isCrossDay, notify, actId)
  505 + end,
  506 + ["close"] = function(self, actType, notify, actId)
  507 + local actData = self:getActData(actType)
  508 + local cfg = csvdb["activity_ctrlCsv"][actId]
  509 + if not cfg then return end
  510 + actData[cfg.condition] = nil
  511 + self:updateActData(actType, actData, not notify)
  512 + end,
  513 +}
  514 +
476 515 -- 挂机掉落
477 516 activityFunc[Activity.ActivityType.HangDrop] = {
478 517 ["init"] = function(self, actType, isCrossDay, notify, actId)
... ... @@ -524,7 +563,9 @@ function Activity:closeActivity(actId, notify, notUpdateAct)
524 563 self:recycleActItem(actId)
525 564 end
526 565 if Activity.schema["act".. actType] then
527   - self:updateActData(actType, Activity.schema["act" .. actType][2], not notify or notUpdateAct)
  566 + if not Activity.schema["act" .. actType][3] then
  567 + self:updateActData(actType, Activity.schema["act" .. actType][2], not notify or notUpdateAct)
  568 + end
528 569 end
529 570 end
530 571  
... ... @@ -689,5 +730,60 @@ function Activity:getBattleTicket(actId)
689 730 end
690 731 end
691 732  
  733 +activityFunc[Activity.ActivityType.ActShopGoods] = {
  734 + ["init"] = function(self, actType, isCrossDay, notify, actId)
  735 + end,
  736 + ["close"] = function(self, actType, notify)
  737 + local rechargeRecord = self.owner.storeData:getProperty("payR")
  738 + for id, cfg in pairs(csvdb["shop_rechargeCsv"]) do
  739 + if cfg.shop == 3 and cfg.type == ShopPackType.ActShopPack then
  740 + rechargeRecord[id] = nil
  741 + end
  742 + end
  743 + self.owner.storeData:updateProperty({field="payR", value=rechargeRecord})
  744 + end,
  745 +}
  746 +
  747 +
  748 +
  749 +activityFunc[Activity.ActivityType.Crisis] = {
  750 + ["check"] = function(self, actType, notify, atype, count) -- 检查
  751 + count = count or 1
  752 + local isOpen, actId = self:isOpen(actType)
  753 + local actData = self:getActData(actType) or {}
  754 + actData.task = actData.task or {}
  755 + local change = false
  756 + local actCsv = csvdb["activity_crisisCsv"][actId]
  757 + for id, actSet in pairs(actCsv) do
  758 + if actSet.type == atype then
  759 + local status = actData.task[id] or 0
  760 + status = status + count
  761 + if status >= actSet.condition1 then
  762 + local reward
  763 + if actSet.loop == 1 then
  764 + local rcount = math.floor(status / actSet.condition1)
  765 + reward = actSet.reward:toNumMap()
  766 + for itemId, itemC in pairs(reward) do
  767 + reward[itemId] = itemC * rcount
  768 + end
  769 + status = status % actSet.condition1
  770 + else
  771 + reward = actSet.reward
  772 + status = -1
  773 + end
  774 +
  775 + self.owner:award(reward, {log = {desc = "activity_crisis"}, notNotify = not notify})
  776 + end
  777 + actData.task[id] = status
  778 + change = true
  779 + end
  780 + end
  781 + if change then
  782 + -- 更新下排行榜
  783 + self.owner:updateRankCommon(RANK_TYPE.ActCrisis, self.owner:getItemCount(ItemId.CrisisScore))
  784 + self:updateActData(actType, actData)
  785 + end
  786 + end,
  787 +}
692 788  
693 789 return Activity
... ...
src/models/Email.lua
... ... @@ -62,7 +62,11 @@ function Email:data()
62 62 end
63 63  
64 64 if attachments == "" and emailData.attachment ~= "" then
65   - attachments = emailData.attachment:format(table.unpack(rewardPms))
  65 + if next(rewardPms) then
  66 + attachments = emailData.attachment:format(table.unpack(rewardPms))
  67 + else
  68 + attachments = emailData.attachment
  69 + end
66 70 end
67 71 end
68 72  
... ...
src/models/RoleBattle.lua
... ... @@ -44,7 +44,7 @@ function Role:checkBattle(battleType, params)
44 44  
45 45 local fixData = {
46 46 hang = function()
47   - for slot, hero in pairs(self:getProperty("hangTS")) do
  47 + for slot, hero in pairs(self:getProperty("hangTS").heros) do
48 48 selflist[slot] = hero.type
49 49 end
50 50 heroscore = self:getProperty("hangTBV")
... ... @@ -59,7 +59,7 @@ function Role:checkBattle(battleType, params)
59 59 end,
60 60 tower = function()
61 61 local towerF = self:getTeamFormatByType(TeamSystemType.Tower)
62   - for slot, hero in pairs(self:getTeamHerosInfo(towerF.heros)) do
  62 + for slot, hero in pairs(self:getTeamHerosInfo(towerF).heros) do
63 63 selflist[slot] = hero.type
64 64 end
65 65 heroscore = self:getTeamBattleValue(towerF.heros)
... ... @@ -74,7 +74,7 @@ function Role:checkBattle(battleType, params)
74 74 end,
75 75 bonus = function()
76 76 local bTeam = self:getTeamFormatByType(TeamSystemType.BonusBattle)
77   - for slot, hero in pairs(self:getTeamHerosInfo(bTeam.heros)) do
  77 + for slot, hero in pairs(self:getTeamHerosInfo(bTeam).heros) do
78 78 selflist[slot] = hero.type
79 79 end
80 80 heroscore = self:getTeamBattleValue(bTeam.heros)
... ... @@ -88,7 +88,7 @@ function Role:checkBattle(battleType, params)
88 88 end
89 89 end,
90 90 act_battle = function()
91   - for slot, hero in pairs(self:getTeamHerosInfo(params.heros)) do
  91 + for slot, hero in pairs(self:getTeamHerosInfo(params).heros) do
92 92 selflist[slot] = hero.type
93 93 end
94 94 heroscore = self:getTeamBattleValue(params.heros)
... ... @@ -102,7 +102,7 @@ function Role:checkBattle(battleType, params)
102 102 end
103 103 end,
104 104 pvpc = function()
105   - for slot, hero in pairs(self:getProperty("pvpTSC")) do
  105 + for slot, hero in pairs(self:getProperty("pvpTSC").heros) do
106 106 selflist[slot] = hero.type
107 107 end
108 108 heroscore = self:getProperty("pvpTBVC")
... ... @@ -124,7 +124,7 @@ function Role:checkBattle(battleType, params)
124 124 pvph = function()
125 125 for idx, team in pairs(self:getProperty("pvpTSH")) do
126 126 selflist[idx] = selflist[idx] or {}
127   - for slot, hero in pairs(team) do
  127 + for slot, hero in pairs(team.heros) do
128 128 selflist[idx][slot] = hero.type
129 129 end
130 130 end
... ...
src/models/RoleCross.lua
... ... @@ -19,8 +19,8 @@ RoleCross.bind = function (Role)
19 19 -- 好友详细队伍信息
20 20 function Role:friendInfo()
21 21 local info = self:friendSInfo()
22   - local heros = self:getProperty("pvpTBVC") ~= 0 and self:getProperty("pvpTSC") or self:getProperty("hangTS")
23   - info.heros = heros
  22 + local team = self:getProperty("pvpTBVC") ~= 0 and self:getProperty("pvpTSC") or self:getProperty("hangTS")
  23 + info.team = team
24 24 return info
25 25 end
26 26  
... ... @@ -36,7 +36,7 @@ RoleCross.bind = function (Role)
36 36 level = self:getProperty("level"),
37 37 headId = self:getProperty("headId"),
38 38 battleV = self:getProperty("pvpTBVC"),
39   - heros = self:getProperty("pvpTSC"),
  39 + team = self:getProperty("pvpTSC"),
40 40 battleInfo = self:getProperty("pvpTBC")
41 41 }
42 42 return info
... ... @@ -49,7 +49,7 @@ RoleCross.bind = function (Role)
49 49 level = self:getProperty("level"),
50 50 headId = self:getProperty("headId"),
51 51 battleV = self:getProperty("pvpTBVH"),
52   - heros = self:getProperty("pvpTSH"),
  52 + team = self:getProperty("pvpTSH"),
53 53 battleInfo = self:getProperty("pvpTBH")
54 54 }
55 55 return info
... ... @@ -281,7 +281,7 @@ function CMD.friendInfo(roleId)
281 281 headId = info.headId,
282 282 ltime = info.ltime,
283 283 battleV = info.pvpTBVC ~= 0 and info.pvpTBVC or info.hangTBV,
284   - heros = info.pvpTBVC ~= 0 and info.pvpTSC or info.hangTS
  284 + team = info.pvpTBVC ~= 0 and info.pvpTSC or info.hangTS
285 285 }
286 286 end
287 287  
... ... @@ -297,7 +297,7 @@ function CMD.pvpCInfo(roleId)
297 297 level = info.level,
298 298 headId = info.headId,
299 299 battleV = info.pvpTBVC,
300   - heros = info.pvpTSC,
  300 + team = info.pvpTSC,
301 301 battleInfo = info.pvpTBC
302 302 }
303 303 end
... ... @@ -309,7 +309,7 @@ function CMD.pvpHInfo(roleId)
309 309 level = info.level,
310 310 headId = info.headId,
311 311 battleV = info.pvpTBVH,
312   - heros = info.pvpTSH,
  312 + team = info.pvpTSH,
313 313 battleInfo = info.pvpTBH
314 314 }
315 315 end
... ...
src/models/RoleLog.lua
1 1 local serverId = skynet.getenv("servId")
2 2 local server_id = (skynet.getenv("serverType") or "localtest") .. "_" .. serverId
  3 +local logproxy = require "shared.logproxy"
3 4  
4 5 --[[
5 6 100 购买/兑换行为
... ... @@ -49,6 +50,7 @@ local ItemReason = {
49 50 actHangDrop = 134, -- 掉落活动奖励
50 51 actBattle = 135, -- 活动关卡
51 52 actMilestone = 136, -- 活动关卡boss伤害里程碑
  53 + worldBossReward = 137, -- 世界boss翻牌奖励
52 54  
53 55  
54 56 advHang = 301, -- 拾荒挂机
... ... @@ -89,6 +91,7 @@ local ItemReason = {
89 91 actSign = 1007, -- 活动签到
90 92 actPaySign = 1008, -- 活动付费签到
91 93 calendaTask = 1009, -- 英雄帖
  94 + actMilecrisis = 1010, -- 物资危机
92 95  
93 96 -- 餐厅
94 97 greenHourse = 1101, -- 食材获得
... ... @@ -251,13 +254,6 @@ local MethodType = {
251 254 hero_break_result = "json", -- 英雄突破效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..}
252 255 hero_break_level = true, -- 英雄突破后等级上限
253 256 },
254   - hero_talent = { --英雄天赋升级
255   - hero_id = true, -- 英雄ID
256   - hero_talent_cost = "json", -- 英雄天赋升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
257   - hero_talent_levelbef = true, -- 英雄技能升级前等级
258   - hero_talent_level = true, -- 英雄技能升级后等级
259   - hero_talent_id = true, -- 天赋id
260   - },
261 257 hero_jewel = { --英雄铭文
262 258 hero_id = true, -- 英雄ID
263 259 hero_jewel_sequence = "ucode", -- 铭文装备编号,用以关联一次装备时产生的多条日志
... ... @@ -287,7 +283,7 @@ local MethodType = {
287 283 gacha_up = true, -- 卡池UP角色
288 284 gacha_times = true, -- 抽卡次数
289 285 gacha_reward = "json", -- 抽卡结果,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
290   - currency = "json", -- 消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
  286 + gacha_cost = "json", -- 消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
291 287 gacha_cnt = true, -- 保底计数
292 288 },
293 289 equip_wear = { --装备穿戴与卸载
... ... @@ -295,8 +291,8 @@ local MethodType = {
295 291 equip_id = true, --装备ID
296 292 equip_wear_action = true, --装备操作类型:装备:0,卸载:1
297 293 equip_wear_part = true, --装备部位,记录部位ID
298   - equip_wear_result = "json", --装备操作后结果,记录属性变化,json格式记录,{“aa”:1234,"bb":4567}
299   - equip_wear_change = "json", --装备操作变化值,记录属性变化,记录正负值,json格式记录,{“aa”:1234,"bb":-45}
  294 + equip_wear_scorebef = true, --装备前英雄评分
  295 + equip_wear_score = true, --装备后英雄评分
300 296 equip_wear_mode = true, --用以区分自动装备还是手动装备,自动记录为0,手动记录为1
301 297 equip_wear_seqid = "ucode", --自动穿戴时记录的系列ID,用以关联一次性装备时候产生的多条记录
302 298 },
... ... @@ -413,6 +409,7 @@ local MethodType = {
413 409 restaurant_order_status = true, -- 订单任务状态,接受:0, 拒绝:1, 完成:2
414 410 restaurant_order_rwd = "json", -- 订单完成奖励,json格式记录,{"itemid1":123,"itemid2":12,……….}
415 411 restaurant_order_lv = true, -- 订单品质等级,普通:0, 稀有:1, 顶级:2, 豪华:3
  412 + restaurant_order_type = true, -- 订单任务类型,0:特殊顾客,1:特别订单
416 413 },
417 414 restaurant_collect = { --餐厅顾客图谱
418 415 restaurant_collect_id = true, -- 图谱收集ID
... ... @@ -504,6 +501,28 @@ local MethodType = {
504 501 mission_pick_fund_beflv = true, -- 资助前资助等级
505 502 mission_pick_fund_aftlv = true, -- 资助后资助等级
506 503 },
  504 + function_open = { -- 功能开启日志
  505 + function_id = true, --功能ID
  506 + },
  507 + punitive_action = { -- 讨伐行动 --TODO
  508 + mission_id = true, --关卡ID
  509 + mission_herolist = "json", -- 英雄ID,排序以玩家出战设置为准,示例:[111, 222, 333, 444, 555]
  510 + mission_success_rate = true, -- 大成功几率
  511 + mission_reward = "json", -- 获得奖励,建议使用json格式记录。示例:{ itemid1: 1, itemid2: 3, itemid3: 5}
  512 + mission_result = true, -- 战斗结果(0-无效,1-胜利,2-失败)
  513 + mission_roundtime = true, -- 完成耗时(秒)
  514 + mission_cleartype = true, -- 1-开始; 2-完成(领取奖励时)
  515 + },
  516 + hero_talent = { --英雄精进(原英雄天赋升级) TODO
  517 + hero_id = true, --英雄ID
  518 + hero_talent_stagebef = true, --英雄精进升级前停留阶段
  519 + hero_talent_stage = true, --英雄精进升级后停留阶段
  520 + hero_talent_cost = "json", --英雄精进升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,….}
  521 + hero_talent_subid = true, --升级属性ID,生命、攻击、防御、命中、闪避分别对应(0,1,2,3,4)
  522 + hero_talent_sublevel = true, --升级属性等级,如生命升级从1到2,则记录2
  523 + },
  524 +
  525 +
507 526 }
508 527  
509 528 local function printError(info)
... ... @@ -524,20 +543,26 @@ local function isIos(self)
524 543 return sid == 2
525 544 end
526 545  
527   -local appid, sdkId
  546 +local sdkId
  547 +local AppId = {
  548 + [1] = 4787,
  549 + [2] = 4788,
  550 + [3] = 4789,
  551 +}
528 552 local function getBaseLog(self)
529 553 local uid = self:getProperty("uid")
530   - if not appid then
531   - appid, sdkId = string.match(uid, "(.*)_(.*)")
532   - if not appid then
  554 + local sid = self:getProperty("sid")
  555 + if not sdkId then
  556 + _, sdkId = string.match(uid, "(.*)_(.*)")
  557 + if not _ then
533 558 sdkId = uid
534   - appid = 0
535 559 end
536 560 end
  561 +
537 562 local log = {
538 563 server_id = server_id,
539 564 timestamp = skynet.timex(),
540   - app_id = appid,
  565 + app_id = AppId[sid] or 0,
541 566 plat_id = isIos(self) and 0 or 1,
542 567 sdk_uid = sdkId,
543 568 account_id = uid,
... ... @@ -565,6 +590,7 @@ local LogType = {
565 590 logout = "common",
566 591 guide = "common",
567 592 newdevice = "common",
  593 + cbback = "common",
568 594  
569 595 in_item = "common",
570 596 out_item = "common",
... ... @@ -765,8 +791,7 @@ function RoleLog.bind(Role)
765 791 end
766 792 end
767 793 end
768   - if not logd then return end
769   - pcall(skynet.send, logd, "lua", "log", doc, "bi")
  794 + logproxy:log(doc, "bi")
770 795 end
771 796  
772 797 function Role:logItems(itemId, before, after, log)
... ... @@ -825,8 +850,7 @@ function RoleLog.bind(Role)
825 850 end
826 851 end
827 852 doc["@type"] = logType
828   - if not logd then return end
829   - pcall(skynet.send, logd, "lua", "log", doc, "log")
  853 + logproxy:log(doc, "log")
830 854 end
831 855  
832 856  
... ...
src/models/RolePlugin.lua
... ... @@ -356,16 +356,41 @@ function RolePlugin.bind(Role)
356 356 if not self:costDiamond(pms) then
357 357 return
358 358 end
359   - itemCountT[ItemId.Diamond] = nil
360 359 end
361 360 for itemId, count in pairs(itemCountT) do
362   - pms.itemId = itemId
363   - pms.count = - count
364   - self:addItem(pms)
  361 + if itemId ~= ItemId.Diamond then
  362 + pms.itemId = itemId
  363 + pms.count = - count
  364 + self:addItem(pms)
  365 + self:itemDeltaEvent(pms)
  366 + end
365 367 end
366 368 return true
367 369 end
368 370  
  371 + function Role:itemDeltaEvent(pms)
  372 + self:eventBoxL(pms)
  373 + end
  374 +
  375 + -- 拆解室的生产线启动
  376 + function Role:eventBoxL(pms)
  377 + local limit = globalCsv.box_key_max[pms.itemId]
  378 + if not limit then return end
  379 +
  380 + local update = false
  381 + local boxL = self:getProperty("boxL") or {}
  382 + for slot, data in pairs(boxL) do
  383 + if data.time == 0 and data.id == pms.itemId and self:getItemCount(pms.itemId) < limit then
  384 + update = true
  385 + data.time = skynet.timex()
  386 + end
  387 + end
  388 +
  389 + if update then
  390 + self:updateProperty({field = "boxL", value = boxL})
  391 + end
  392 + end
  393 +
369 394 function Role:getItemCount(itemId)
370 395 if itemId == ItemId.Diamond then
371 396 return self:getAllDiamond()
... ... @@ -1014,6 +1039,7 @@ function RolePlugin.bind(Role)
1014 1039  
1015 1040 if csvdb["itemCsv"][func] and csvdb["itemCsv"][func].type == ItemType.FuncOpen then
1016 1041 local unlockData = csvdb["unlockCsv"][func]
  1042 + self:log("function_open", {function_id = func})
1017 1043 if unlockData.type == 4 then -- 解锁神器
1018 1044 if self:getProperty("advAFOpen")[unlockData.value1] ~= 1 then
1019 1045 self:changeUpdates({{type = "advAFOpen", field = unlockData.value1, value = 1}})
... ... @@ -1176,7 +1202,7 @@ function RolePlugin.bind(Role)
1176 1202 lv = self:getProperty("level"),
1177 1203 batteV = battleV,
1178 1204 level = level,
1179   - format = self:getTeamHerosInfo(towerTeam.heros),
  1205 + format = self:getTeamHerosInfo(towerTeam).heros,
1180 1206 }
1181 1207 local roleId = self:getProperty("id")
1182 1208 redisproxy:pipelining(function (red)
... ... @@ -1324,9 +1350,10 @@ function RolePlugin.bind(Role)
1324 1350 return teamInfo
1325 1351 end
1326 1352  
1327   - function Role:getTeamHerosInfo(heroIds)
  1353 + function Role:getTeamHerosInfo(team)
  1354 + local format = {}
1328 1355 local heros = {}
1329   - for slot, heroId in pairs(heroIds or {}) do
  1356 + for slot, heroId in pairs(team.heros or {}) do
1330 1357 local hero = self.heros[heroId]
1331 1358 heros[slot] = {
1332 1359 type = hero:getProperty("type"),
... ... @@ -1334,7 +1361,10 @@ function RolePlugin.bind(Role)
1334 1361 wakeL = hero:getProperty("wakeL"),
1335 1362 }
1336 1363 end
1337   - return heros
  1364 + format.heros = heros
  1365 + format.supports = team.supports or {}
  1366 + format.tactics = team.tactics or nil
  1367 + return format
1338 1368 end
1339 1369  
1340 1370 function Role:getTeamBattleValue(heros)
... ... @@ -1352,7 +1382,7 @@ function RolePlugin.bind(Role)
1352 1382 if not team then return end
1353 1383  
1354 1384 self:setProperties({
1355   - hangTS = self:getTeamHerosInfo(team.heros),
  1385 + hangTS = self:getTeamHerosInfo(team),
1356 1386 hangTB = self:getTeamBattleInfo(team),
1357 1387 hangTBV = self:getTeamBattleValue(team.heros),
1358 1388 })
... ... @@ -1400,7 +1430,7 @@ function RolePlugin.bind(Role)
1400 1430 self:updateProperty({field = "pvpTC", value = team})
1401 1431 end
1402 1432 self:setProperties({
1403   - pvpTSC = self:getTeamHerosInfo(team.heros),
  1433 + pvpTSC = self:getTeamHerosInfo(team),
1404 1434 pvpTBC = self:getTeamBattleInfo(team),
1405 1435 pvpTBVC = self:getTeamBattleValue(team.heros),
1406 1436 })
... ... @@ -1416,7 +1446,7 @@ function RolePlugin.bind(Role)
1416 1446 local pvpTSH, pvpTBH, pvpTBVH = {}, {}, {}
1417 1447 for i = 1, 3 do
1418 1448 if team[i] then
1419   - pvpTSH[i] = self:getTeamHerosInfo(team[i].heros)
  1449 + pvpTSH[i] = self:getTeamHerosInfo(team[i])
1420 1450 pvpTBH[i] = self:getTeamBattleInfo(team[i])
1421 1451 pvpTBVH[i] = self:getTeamBattleValue(team[i].heros)
1422 1452 end
... ... @@ -1575,10 +1605,17 @@ function RolePlugin.bind(Role)
1575 1605 return ""
1576 1606 end
1577 1607 local limit = rechargeData.limit
1578   - local rechargeRecord = self:getProperty("payR") or {}
  1608 + local rechargeRecord = self.storeData:getProperty("payR") or {}
1579 1609 if limit ~= 0 and limit <= (rechargeRecord[rechargeId] or 0) then
1580 1610 return ""
1581   - end
  1611 + end
  1612 +
  1613 + --判断是否是活动商品
  1614 + if rechargeData.activity_id ~= 0 then
  1615 + local actCfg = csvdb["activity_ctrlCsv"][rechargeData.activity_id]
  1616 + if not actCfg then return "" end
  1617 + if not self.activity:isOpenById(rechargeData.activity_id, "ActShopGoods") then return "" end
  1618 + end
1582 1619  
1583 1620 local orderId = redisproxy:hget(string.format(R_ORDERS, roleId), rechargeId)
1584 1621 if orderId then
... ... @@ -1596,6 +1633,7 @@ function RolePlugin.bind(Role)
1596 1633 key = orderKey,
1597 1634 order = partnerOrderId,
1598 1635 rechargeId = rechargeId,
  1636 + createTime = skynet.timex(),
1599 1637 })
1600 1638 order:create()
1601 1639 -- 正在进行中的订单 缓存
... ... @@ -1639,7 +1677,7 @@ function RolePlugin.bind(Role)
1639 1677 -- 开始下单
1640 1678 if status == "success" then
1641 1679 elseif status == "fail" then
1642   - redisproxy:hdel(string.format(R_ORDERS, roleId), rechargeId)
  1680 + -- redisproxy:hdel(string.format(R_ORDERS, roleId), rechargeId)
1643 1681 elseif status == "finsh" then
1644 1682 orderObject:setProperty("finishTime", skynet.time())
1645 1683 redisproxy:hdel(string.format(R_ORDERS, roleId), rechargeId)
... ... @@ -1824,10 +1862,10 @@ function RolePlugin.bind(Role)
1824 1862 end
1825 1863  
1826 1864 -- 抽卡阶段奖励
1827   - function Role:getDrawCardExtraReward(oldVal, newVal)
  1865 + function Role:getDrawCardExtraReward(feedbackId, oldVal, newVal)
1828 1866 local reward = nil
1829 1867 local maxCount = 0
1830   - for k, v in pairs(csvdb["build_extraRewardCsv"]) do
  1868 + for k, v in pairs(csvdb["build_extraRewardCsv"][feedbackId]) do
1831 1869 if oldVal < k and newVal >= k then
1832 1870 reward = v["reward"] or ""
1833 1871 end
... ...
src/models/RolePvp.lua
... ... @@ -233,7 +233,6 @@ function Role:refreshPvpMatch(score, rank, rankKey)
233 233 if low < 0 then
234 234 low = 0
235 235 end
236   - print(low, heigh)
237 236 local rangeIds = redisproxy:ZREVRANGE(dbKey, low, heigh)
238 237 local lastRangeIds = {}
239 238 for idx, one in ipairs(rangeIds) do
... ...
src/models/RoleTask.lua
... ... @@ -48,6 +48,8 @@ local TaskType = {
48 48 AdvScore = 410, -- 冒险分数 - score
49 49 AdvDraw = 411, -- 冒险资助 - count ptype
50 50 AdvHang = 412, -- 代理拾荒次数
  51 + AdvMineKill = 413, -- 宝藏怪击杀
  52 + AdvMineLayer = 414, -- 宝藏洞激活
51 53  
52 54 --爬塔相关
53 55 TowerPass = 501, -- 爬塔通关 - level
... ... @@ -146,7 +148,7 @@ local CommonListener = {
146 148 [TaskType.AdvStartSelf] = {{24}},
147 149 [TaskType.ShopAll] = {{25, f("count")}},
148 150 [TaskType.RuneUp] = {{26}},
149   - [TaskType.OpenBox] = {{27, 1, f("id")}},
  151 + [TaskType.OpenBox] = {{27, f("count"), f("id")}},
150 152 [TaskType.AdvDraw] = {{28, f("count"), f("ptype")}},
151 153 [TaskType.PotionMake] = {{29, f("count"), f("id")}},
152 154 }
... ... @@ -172,7 +174,7 @@ local AchievListener = {
172 174 [TaskType.FoodSellGold] = {{15, f("count")}},
173 175 [TaskType.DinerPopular] = {{16, f("count")}},
174 176 [TaskType.TowerPass] = {{17, f("level")}},
175   - [TaskType.OpenBox] = {{18}},
  177 + [TaskType.OpenBox] = {{18, f("count")}},
176 178 [TaskType.DinerLevelUp] = {{19, f("level"), f("type")}},
177 179 [TaskType.DinerTalentUp] = {{20, 1, f("type")}},
178 180 [TaskType.HangGetGold] = {{21, f("count")}},
... ... @@ -209,7 +211,7 @@ local SudokuListener = {
209 211 [TaskType.AdvDraw] = {{10, f("count")}},
210 212 [TaskType.DinerLevelUp] = {{11, f("level"), f("type")}},
211 213 [TaskType.FoodSell] = {{12, f("count")}},
212   - [TaskType.OpenBox] = {{13, 1}},
  214 + [TaskType.OpenBox] = {{13, f("count")}},
213 215 [TaskType.TowerPass] = {{14, f("level")}},
214 216 [TaskType.PvpWin] = {{15, 1}},
215 217 [TaskType.DinerTalentUp] = {{16, f("level"), f("type")}},
... ... @@ -218,6 +220,7 @@ local SudokuListener = {
218 220 }
219 221  
220 222 local Activity = require("models.Activity")
  223 +
221 224 local ActivityListener = {
222 225 func = "checkActivityTask",
223 226 listen = {
... ... @@ -226,6 +229,8 @@ local ActivityListener = {
226 229 [TaskType.AdvDraw] = {{Activity.ActivityType.AdvDraw, f("count")}},
227 230 [TaskType.OpenBox] = {{Activity.ActivityType.OpenBox, f("count")}},
228 231 [TaskType.Pay] = {{Activity.ActivityType.PayBack, f("twd")}},
  232 + [TaskType.AdvMineKill] = {{Activity.ActivityType.Crisis, 1}},
  233 + [TaskType.AdvMineLayer] = {{Activity.ActivityType.Crisis, 2}},
229 234 }
230 235 }
231 236  
... ... @@ -266,7 +271,6 @@ local CalendaTaskListener = {
266 271 }
267 272 }
268 273  
269   -
270 274 local TaskListeners = {
271 275 StoryListener,
272 276 CommonListener,
... ... @@ -358,11 +362,22 @@ function RoleTask.bind(Role)
358 362 return true
359 363 end
360 364  
  365 + local function checkStoryStatusByActBattle(role, data, status, cond1) -- cond1 carbonId
  366 + local actid = data.sort
  367 + if not role.activity:isOpenById(actid) then return end
  368 + if cond1 and tonumber(data.unlockData) == cond1 then
  369 + status.s = 1
  370 + return true
  371 + end
  372 + return
  373 + end
  374 +
361 375 local checkstoryStatusFunc = {
362 376 [1] = checkStoryStatusByHang,
363 377 [2] = checkStoryStatusByLove,
364 378 [3] = checkStoryStatusByMultStar,
365 379 [4] = checkStoryStatusByAdv,
  380 + [5] = checkStoryStatusByActBattle,
366 381 }
367 382  
368 383 function Role:checkStoryStatus(notNotify, stype, cond1, cond2, cond3)
... ...
src/models/Store.lua
... ... @@ -298,6 +298,8 @@ function Store:resetStoreReored(resetId)
298 298 end
299 299 end
300 300 end
  301 + else
  302 + payRecord[k] = nil
301 303 end
302 304 end
303 305 self:updateProperty({field = "payR", value = payRecord})
... ... @@ -307,6 +309,8 @@ function Store:resetStoreReored(resetId)
307 309 if config.resetTime == resetId then
308 310 buyRecord[k] = nil
309 311 end
  312 + else
  313 + buyRecord[k] = nil
310 314 end
311 315 end
312 316 self:updateProperty({field = "buyR", value = buyRecord})
... ... @@ -388,6 +392,9 @@ function Store:onBuyPaySignCard(dur)
388 392 curTs = getServerOpenTs()
389 393  
390 394 self:SetActGoodsFlag("paySignIn", curTs)
  395 + local actData = self.owner.activity:getActData("PaySignIn")
  396 + actData[0] = 1
  397 + self.owner.activity:updateActData("PaySignIn", actData)
391 398  
392 399 --local actGoodsFlag = self:getProperty("actGoodsFlag") or {}
393 400 --local goodsIndex = GetActGoodsIndex("paySignIn")
... ...
src/services/agent_ctrl.lua
... ... @@ -6,6 +6,7 @@ local xxtea = require &quot;xxtea&quot;
6 6 local deque = require "deque"
7 7 local datacenter = require "skynet.datacenter"
8 8 local agent_queued = require "services.agent_queued"
  9 +local logproxy = require "shared.logproxy"
9 10  
10 11 local pcall = pcall
11 12 local string_format = string.format
... ... @@ -139,11 +140,11 @@ function _M:check_agent_status()
139 140 end
140 141 end
141 142  
142   - if now >= next_log_time and now % 60 == 0 and logd then
  143 + if now >= next_log_time and now % 60 == 0 then
143 144 next_log_time = now + 60
144 145 local count = table_nums(self.u2f)
145 146 datacenter.set("onlineCount", count)
146   - pcall(skynet.send, logd, "lua", "log", {["@type"] = "online", count = count}, "log")
  147 + logproxy:log({["@type"] = "online", count = count}, "log")
147 148 end
148 149 end
149 150  
... ...
src/services/dbseed.lua
... ... @@ -34,8 +34,6 @@ local steps = {
34 34 }
35 35  
36 36 skynet.start(function ()
37   - redisd = skynet.localname(".redis")
38   -
39 37 redisproxy = require("shared.redisproxy")
40 38  
41 39 local new = redisproxy:hsetnx("autoincrement_set", "server_start", os.date("%Y%m%d", skynet.timex())) == 1
... ...
src/services/globald.lua
... ... @@ -175,7 +175,7 @@ end
175 175  
176 176 function CMD.start()
177 177 check_mail_queue()
178   - check_battle_act_close()
  178 + --check_battle_act_close()
179 179 end
180 180  
181 181 local function __init__()
... ... @@ -190,7 +190,6 @@ local function __init__()
190 190 end
191 191 end
192 192 end)
193   - redisd = skynet.localname(".redis")
194 193 skynet.register(".globald")
195 194  
196 195 end
... ...
src/services/httpweb.lua
... ... @@ -53,12 +53,8 @@ end
53 53 local CMD = require "actions.HttpAction"
54 54  
55 55 local function start()
56   - redisd = skynet.localname(".redis")
57 56 globalCsv = csvdb["GlobalDefineCsv"]
58 57  
59   - if tonumber(skynet.getenv "logd") == 1 then
60   - logd = skynet.localname(".log")
61   - end
62 58  
63 59 local listen_socket = socket.listen("0.0.0.0", port)
64 60 print("Listen web port " .. port)
... ... @@ -77,11 +73,11 @@ local function start()
77 73 return
78 74 end
79 75 local query = urllib.parse_query(query)
80   - if query.key ~= key then
81   - response(id, 404)
82   - socket.close(id)
83   - return
84   - end
  76 + -- if query.key ~= key then
  77 + -- response(id, 404)
  78 + -- socket.close(id)
  79 + -- return
  80 + -- end
85 81 local content = CMD[cmd](query, body)
86 82 if not content then
87 83 code = 404
... ...
src/services/logd.lua
... ... @@ -2,12 +2,12 @@ local skynet = require &quot;skynet&quot;
2 2 local queue = require "skynet.queue"
3 3 local bson = require "bson"
4 4 local socketdriver = require "skynet.socketdriver"
5   -
6 5 local serverId = tonumber(skynet.getenv("servId"))
7 6  
8 7 require "shared.init"
9 8 require "skynet.manager"
10 9  
  10 +local logdIdx = ...
11 11 local table_insert = table.insert
12 12 local pairs = pairs
13 13 local ipairs = ipairs
... ... @@ -15,6 +15,7 @@ local string_format = string.format
15 15  
16 16 local logId = 0
17 17 local CMD, cs = {}
  18 +local prefix = "wasteland" .. logdIdx .. "S" .. serverId .. "C"
18 19  
19 20 local logHandle = {
20 21 bi = {
... ... @@ -33,7 +34,7 @@ local logHandle = {
33 34 doc["game_name"] = "wasteland"
34 35 doc["env"] = "cb"
35 36 doc["game_name_type"] = "guaji"
36   - doc["log_id"] = "wastelandC" .. logId .. "S" .. serverId .. "T" .. now
  37 + doc["log_id"] = prefix .. logId .. "T" .. now
37 38 logId = (logId + 1) % 10000000
38 39 end
39 40 },
... ... @@ -135,7 +136,7 @@ local function __init__()
135 136 end)
136 137 cs = queue()
137 138  
138   - skynet.register(".log")
  139 + skynet.register(".logd" .. logdIdx)
139 140 end
140 141  
141 142 skynet.start(__init__)
... ...
src/services/pvpd.lua
... ... @@ -289,7 +289,6 @@ end
289 289  
290 290 ------------------------------------------------------
291 291 function CMD.start()
292   - redisd = skynet.localname(".redis")
293 292 globalCsv = csvdb["GlobalDefineCsv"]
294 293  
295 294 pvpInfo = require("models.Pvpd").new({key = "cross:pvpInfo"})
... ...
src/services/redisd.lua
... ... @@ -3,7 +3,7 @@ require &quot;skynet.manager&quot;
3 3 local redis = require "skynet.db.redis"
4 4  
5 5 local db
6   -
  6 +local idx = ...
7 7 local command = {}
8 8  
9 9 function command.open(conf)
... ... @@ -25,7 +25,7 @@ skynet.start(function()
25 25 end
26 26 end)
27 27 skynet.info_func(function()
28   - skynet.ret(skynet.pack(skynet.call(skynet.self(), "debug", "STAT")))
  28 + return skynet.stat("mqlen")
29 29 end)
30   - skynet.register ".redis"
  30 + skynet.register(".redis" .. idx)
31 31 end)
32 32 \ No newline at end of file
... ...
src/services/watchdog.lua
1 1 local skynet = require "skynet"
2 2 require "skynet.manager"
3   -local redisproxy = require "shared.redisproxy"
4 3 local socket = require "skynet.socket"
5 4 local netpack = require "skynet.netpack"
6 5 local datacenter = require "skynet.datacenter"
... ... @@ -47,7 +46,7 @@ function SOCKET.data(fd, msg)
47 46 end
48 47 end
49 48  
50   -local use_logd = tonumber(skynet.getenv "logd")
  49 +
51 50  
52 51 -- @desc: agent状态定时检测
53 52 function check_agent_status()
... ... @@ -65,11 +64,7 @@ end
65 64  
66 65 function CMD.start(conf)
67 66 skynet.call(gate_serv, "lua", "open" , conf)
68   - skynet.call(redisd, "lua", "open", conf)
69   -
70   - if use_logd == 1 then
71   - skynet.call(logd, "lua", "open")
72   - end
  67 +
73 68 skynet.call(pvpd, "lua", "start")
74 69 -- 开启agent状态检测定时器
75 70 check_agent_status()
... ... @@ -110,17 +105,11 @@ skynet.start(function()
110 105 end
111 106 end)
112 107 skynet.register ".watchdog"
113   - -- 数据库服务
114   - redisd = skynet.newservice("services/redisd")
115 108  
116 109 -- 提前加载好
117 110 csvdata.init()
118 111 print("launch csvdatad ...")
119 112  
120   - -- 日志服务
121   - if use_logd == 1 then
122   - logd = skynet.newservice("services/logd")
123   - end
124 113 -- pvp 服务
125 114 pvpd = skynet.newservice("services/pvpd")
126 115 cluster.register("pvpd", pvpd)
... ...
src/shared/logproxy.lua 0 → 100644
... ... @@ -0,0 +1,23 @@
  1 +
  2 +local skynet = require "skynet"
  3 +local logd_count = tonumber(skynet.getenv("thread")) * 2
  4 +local use_logd = tonumber(skynet.getenv("logd"))
  5 +
  6 +
  7 +local logd
  8 +skynet.init(function()
  9 + if use_logd then
  10 + local idx = math.randomInt(1, logd_count)
  11 + logd = skynet.localname(".logd" .. idx)
  12 + end
  13 +end)
  14 +
  15 +local logproxy = {}
  16 +
  17 +function logproxy:log(doc, logTo)
  18 + if use_logd and logd then
  19 + pcall(skynet.send, logd, "lua", "log", doc, logTo)
  20 + end
  21 +end
  22 +
  23 +return logproxy
0 24 \ No newline at end of file
... ...
src/shared/redisproxy.lua
1 1 local skynet = require "skynet"
2   -local harbor = require "skynet.harbor"
  2 +require "utils.init"
  3 +
  4 +local redisd_count = tonumber(skynet.getenv("thread"))
  5 +local redisd
  6 +skynet.init(function()
  7 + local idx = math.randomInt(1, redisd_count)
  8 + redisd = skynet.localname(".redis" .. idx)
  9 +end)
3 10  
4 11 local table_insert = table.insert
5 12  
6 13 local redisproxy = {}
7 14  
8   -
9 15 local isUsePika = false
10 16  
11 17  
... ...