Commit b1daa4a81506e0f9cf077133ecbe7f89f547d4d3

Authored by 熊润斐
2 parents 1edf602e 1627de1c

Merge branch 'bugfix' into cn/develop

config/nodenames.lua
1   -center = "192.168.8.198:9000"
  1 +center = "192.168.0.198:9000"
2 2  
3 3 server1 = "127.0.0.1:8101"
4 4 server2 = "127.0.0.1:8102"
5 5 \ No newline at end of file
... ...
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
  1 +BUG_LOG = false
  2 +
  3 +function buglog(tag, advstr, ...)
  4 + if BUG_LOG then
  5 + print(string.format("[%s] %s", tag, string.format(advstr, ...)))
  6 + end
  7 +end
  8 +
  9 +
1 10 XXTEA_KEY = "699D448D6D24f7F941E9F6E99F823E18"
2 11 RESET_TIME = 4
3 12  
... ... @@ -125,8 +134,8 @@ ItemId = {
125 134 RuneFragment = 24,
126 135 HeroFC = {700, 701, 702, 703}, --通用角色碎片
127 136 AdvKey = 80, -- 冒险钥匙
128   - BoxKey = 60, -- 拆解工具
129 137 AdvPower = 4701, -- 拾荒体力
  138 + CrisisScore = 8010, -- 积分
130 139 }
131 140  
132 141 TimeReset = {
... ... @@ -214,6 +223,7 @@ AdvBackEventType = {
214 223 Level = 25, -- 升级
215 224 LinkChooseOver = 26, -- 连锁事件结束
216 225 BuffEffect = 27, -- buff 效果
  226 + PassiveEffect = 28, -- 被动 效果
217 227 }
218 228  
219 229 AdvScoreType = {
... ... @@ -282,6 +292,10 @@ CardType = {
282 292 BattlePassCard = 7, -- 探索指令
283 293 }
284 294  
  295 +ShopPackType = {
  296 + ActShopPack = 5, -- 活动礼包
  297 +}
  298 +
285 299 HeroQuality = {
286 300 N = 1,
287 301 R = 2,
... ... @@ -304,9 +318,12 @@ MailId = {
304 318 ActDrawCardReward = 222,
305 319 ActAdvDrawReward = 223,
306 320 ActOpenBoxReward = 224,
  321 + ActItemRecycle = 225,
307 322  
308 323 PaySignAward = 241,
309 324 PayBackAward = 242,
  325 + CBBackAward = 243,
  326 + CBBackAward2 = 244,
310 327 }
311 328  
312 329 TriggerEventType = {
... ...
src/ProtocolCode.lua
... ... @@ -50,6 +50,7 @@ actionCodes = {
50 50 Role_useSelectItemRpc = 134, -- 使用多选一礼包
51 51 Role_broadGetSSR = 135, -- 全服广播 获得ssr英雄
52 52 Role_renameTeamRpc = 136, -- 编队改名
  53 + Role_accuseRpc = 137, -- 举报
53 54  
54 55 Adv_startAdvRpc = 151,
55 56 Adv_startHangRpc = 152,
... ... @@ -100,6 +101,7 @@ actionCodes = {
100 101 Hero_changeCrown = 223,
101 102 Hero_drawHeroExtraRewardNtf = 224,
102 103 Hero_itemComposeRpc = 225,
  104 + Hero_setWishPoolRpc = 226,
103 105  
104 106 Hang_startRpc = 251,
105 107 Hang_checkRpc = 252,
... ... @@ -202,6 +204,7 @@ actionCodes = {
202 204 Store_getGrowFundRewardRpc = 561, --成长助力奖励
203 205 Store_getBattlePassRewardRpc = 562, --赛季卡奖励
204 206 Store_getExploreCommandRewardRpc = 563, --探索指令
  207 + Store_getTotalRechargeAwardRpc = 564, -- 累计充值
205 208  
206 209 Store_biliAndroidRechargeRpc = 597,
207 210 Store_biliCpsRechargeRpc = 598,
... ... @@ -220,9 +223,19 @@ actionCodes = {
220 223 Activity_actPaySignRewardNtf = 654,
221 224 Activity_actCalendaTaskRpc = 655,
222 225 Activity_actPaySignRpc = 656,
  226 + Activity_exchangeRpc = 657,
  227 + Activity_gachakonRpc = 658,
  228 + Activity_hangDropRpc = 659,
  229 + Activity_startBattleRpc = 660,
  230 + Activity_endBattleRpc = 661,
  231 + Activity_battleRankRpc = 662,
  232 + Activity_battleMilestoneRpc = 663,
  233 + Activity_bossRewardRpc = 664,
  234 + Activity_crisisMilestoneRpc = 665,
223 235  
224 236 Radio_startQuestRpc = 700,
225 237 Radio_finishQuestRpc = 701,
  238 + Radio_cancelQuestRpc = 702,
226 239 }
227 240  
228 241 rpcResponseBegin = 10000
... ...
src/RedisKeys.lua
... ... @@ -15,6 +15,12 @@ R_STORE = &quot;role:%d:store&quot; -- 商店
15 15 R_ORDERS = "role:%d:orders" -- 订单
16 16 R_ORDER = "order:%d:%d"
17 17  
  18 +-- 通用排行榜
  19 +RANK_COMMON = "rank:common:"
  20 +RANK_TYPE = {
  21 + ActBattleBoss = "act_battle_boss",
  22 + ActCrisis = "crisis",
  23 +}
18 24  
19 25 -- rank
20 26 RANK_TOWER = "rank:tower"
... ...
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 -- 奖励
... ... @@ -263,4 +263,630 @@ function _M.actCalendaTaskRpc(agent, data)
263 263 return true
264 264 end
265 265  
  266 +function _M.exchangeRpc(agent, data)
  267 + local role = agent.role
  268 + local msg = MsgPack.unpack(data)
  269 + local actid = msg.actid
  270 + local id = msg.id
  271 + local count = msg.count
  272 + if not role.activity:isOpenById(actid, "Exchange") then return 1 end
  273 +
  274 + local exchangeCfg = csvdb["activity_exchangeCsv"][actid]
  275 + if not exchangeCfg then return 2 end
  276 + if not exchangeCfg[id] then return 3 end
  277 + local curData = role.activity:getActData("Exchange") or {}
  278 + local exchangeData = curData[actid] or {}
  279 + local curCount = exchangeData[id] or 0
  280 + local actCfg = exchangeCfg[id]
  281 + local limitArr = actCfg.limit:toArray(true, "=")
  282 + if curCount + count > limitArr[2] then return 4 end
  283 +
  284 + local costs = actCfg.goods:toNumMap()
  285 + for k,v in pairs(costs) do
  286 + costs[k] = v * count
  287 + end
  288 + if not role:checkItemEnough(costs) then return 5 end
  289 + role:costItems(costs, {log = {desc = "actExchange", int1 = actid, int2 = id}})
  290 +
  291 + curCount = curCount + count
  292 + exchangeData[id] = curCount
  293 + curData[actid] = exchangeData
  294 + role.activity:updateActData("Exchange", curData)
  295 +
  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}})
  302 +
  303 +
  304 + SendPacket(actionCodes.Activity_exchangeRpc, MsgPack.pack(role:packReward(reward, change)))
  305 + return true
  306 +end
  307 +
  308 +function _M.gachakonRpc(agent, data)
  309 + local role = agent.role
  310 + local msg = MsgPack.unpack(data)
  311 + local actid = msg.actid
  312 + local count = msg.count
  313 +
  314 + if count > 10 then return end
  315 +
  316 + if not role.activity:isOpenById(actid, "Gachakon") then return 1 end
  317 +
  318 + local actCtrlData = csvdb["activity_ctrlCsv"][actid]
  319 + if not actCtrlData then return 2 end
  320 + local cost = actCtrlData.condition2:toNumMap()
  321 +
  322 + local actCfg = csvdb["activity_capsuleToysCsv"][actid]
  323 + if not actCfg then return 3 end
  324 +
  325 + local gachakonInfo = role.activity:getActData("Gachakon") or {}
  326 + local award = {}
  327 + local remain = 0
  328 + local showAward = {}
  329 + for i = 1, count do
  330 + local tmpCfg = clone(actCfg)
  331 + remain = 0
  332 + for id, cfg in pairs(tmpCfg) do
  333 + local num = gachakonInfo[id] or 0
  334 + num = cfg.amount >= num and cfg.amount - num or 0
  335 + cfg.weight = cfg.weight * num
  336 + if cfg.weight > 0 then
  337 + remain = remain + num
  338 + end
  339 + --print("num ".. num, id, cfg.weight, cfg.amount)
  340 + end
  341 + if remain == 0 then
  342 + break
  343 + end
  344 + local id = math.randWeight(tmpCfg, "weight")
  345 + if not id then return 4 end
  346 + gachakonInfo[id] = (gachakonInfo[id] or 0) + 1
  347 + local curAward = tmpCfg[id].award:toNumMap()
  348 + table.insert(showAward, curAward)
  349 + for k, v in pairs(curAward) do
  350 + award[k] = (award[k] or 0) + v
  351 + end
  352 + end
  353 +
  354 + for k, v in pairs(cost) do
  355 + cost[k] = v * count
  356 + end
  357 +
  358 + if not role:checkItemEnough(cost) then return 5 end
  359 +
  360 + role:costItems(cost, {log = {desc = "actGachakon", int1 = actid, int2 = count}})
  361 +
  362 + local reward, change = role:award(award, {log = {desc = "actGachakon", int1 = actid, int2 = count}})
  363 + --print("-----------", remain, count)
  364 + if remain <= 1 then
  365 + gachakonInfo = {}
  366 + end
  367 + role.activity:updateActData("Gachakon", gachakonInfo)
  368 +
  369 + SendPacket(actionCodes.Activity_gachakonRpc, MsgPack.pack(showAward))
  370 + return true
  371 +end
  372 +
  373 +function _M.hangDropRpc(agent, data)
  374 + local role = agent.role
  375 + local msg = MsgPack.unpack(data)
  376 + local actid = msg.actid
  377 + if not role.activity:isOpenById(actid, "HangDrop") then return 1 end
  378 + local actCtrlData = csvdb["activity_ctrlCsv"][actid]
  379 + if not actCtrlData then return end
  380 +
  381 + local actCfg = csvdb["activity_putCsv"][actid]
  382 + if not actCfg then return 2 end
  383 +
  384 + local award, period = "", 0
  385 + for i = 1, #actCfg do
  386 + local cfg = actCfg[i]
  387 + if not cfg then
  388 + break
  389 + end
  390 + if cfg.condition ~= "" then
  391 + local arr = cfg.condition:toArray(true, "=")
  392 + local type = arr[1]
  393 + if type == 1 then
  394 + local actId = arr[2]
  395 + local carbonId = arr[3]
  396 + if not role.activity:isOpenById(actId, "ChallengeLevel") then return 3 end
  397 + local clInfo = role.activity:getActData("ChallengeLevel") or {}
  398 + if not clInfo[carbonId] then
  399 + break
  400 + end
  401 + end
  402 + end
  403 + award = cfg.reward
  404 + period = cfg.period * 60
  405 + end
  406 + local actData = role.activity:getActData("HangDrop") or 0
  407 + local timeNow = skynet.timex()
  408 + if period == 0 or award == "" then
  409 + return 4
  410 + end
  411 + local num = math.floor((timeNow - actData)/ period)
  412 + num = num > actCtrlData.condition and actCtrlData.condition or num
  413 + if num == 0 then
  414 + return 5
  415 + end
  416 + local reward, change = {}, nil
  417 + for id, value in pairs(award:toNumMap()) do
  418 + reward[id] = value * num
  419 + end
  420 +
  421 + reward, change = role:award(reward, {log = {desc = "actHangDrop", int1 = actid, int2 = num}})
  422 +
  423 + if num < 8 then
  424 + actData = actData + num * period
  425 + else
  426 + actData = timeNow
  427 + end
  428 +
  429 + role.activity:updateActData("HangDrop", actData)
  430 +
  431 + SendPacket(actionCodes.Activity_hangDropRpc, MsgPack.pack(role:packReward(reward, change)))
  432 +
  433 + return true
  434 +end
  435 +
  436 +local function getStarCount(cfg, data)
  437 + local count = 0
  438 + for i = 0, #(cfg.sweep_condition:toTableArray(true)) do
  439 + if (1 << i & data) > 0 then
  440 + count = count + 1
  441 + end
  442 + end
  443 +
  444 + return count
  445 +end
  446 +
  447 +function _M.startBattleRpc(agent, data)
  448 + local role = agent.role
  449 + local msg = MsgPack.unpack(data)
  450 + local actid = msg.actid
  451 + local id = msg.id
  452 + local count = msg.count
  453 + if not role.activity:isOpenById(actid, "ChallengeLevel") then return 1 end
  454 +
  455 + local actCfg = csvdb["activity_battleCsv"][actid]
  456 + if not actCfg then return 2 end
  457 +
  458 + local battleCfg = actCfg[id]
  459 + if not battleCfg then return 3 end
  460 +
  461 + local actData = role.activity:getActData("ChallengeLevel") or {}
  462 +
  463 + local preArr = battleCfg.prepose:toArray(true, "=")
  464 + for _, v in ipairs(preArr) do
  465 + local battleInfo = actData[v]
  466 + if not battleInfo then
  467 + return 4
  468 + end
  469 + local star = battleInfo["star"] or 0
  470 + if star <= 0 then
  471 + return 4
  472 + end
  473 + end
  474 + -- check cost
  475 + local changeFlag = false
  476 + local ticket = actData["ticket"]
  477 + local num = 0 -- cost num
  478 + if battleCfg.type ~= "" then
  479 + role.activity:getBattleTicket(actid)
  480 + num = battleCfg.type:toArray(true, "=")[3]
  481 + if count and count > 0 then
  482 + if battleCfg.rank == 0 then
  483 + return 7
  484 + end
  485 + local bi = actData[id]
  486 + if not bi then return 8 end
  487 + local star = bi["star"] or 0
  488 + local maxP = bi["maxP"] or 0
  489 + -- 世界boss
  490 + if battleCfg.worldBoss_award ~= 0 then
  491 + if maxP < 1 then
  492 + return 9
  493 + end
  494 + else
  495 + if star < 1 then
  496 + return 9
  497 + end
  498 + end
  499 + num = num * count
  500 + end
  501 + if ticket < num then
  502 + return 6
  503 + end
  504 + changeFlag = true
  505 + end
  506 + -- 解锁活动剧情
  507 + role:checkStoryStatus(false, 5, id)
  508 +
  509 + if not count then
  510 + role.__actBattleCache = {
  511 + key = tostring(math.random()),
  512 + actid = actid,
  513 + id = id,
  514 + }
  515 + SendPacket(actionCodes.Activity_startBattleRpc, MsgPack.pack({key = role.__actBattleCache.key}))
  516 + else
  517 + if count <= 0 then
  518 + return
  519 + end
  520 + if battleCfg.rank == 0 then
  521 + return 7
  522 + end
  523 + local bi = actData[id]
  524 + local star = bi["star"] or 0
  525 + local award = battleCfg.item_clear:toNumMap()
  526 + if getStarCount(battleCfg, star) == 3 then
  527 + local aw = battleCfg.perfect_reward:toNumMap()
  528 + for k, v in pairs(aw) do
  529 + award[k] = (award[k] or 0) + v
  530 + end
  531 + end
  532 + for k, v in pairs(award) do
  533 + award[k] = v * count
  534 + end
  535 + local reward, change = role:award(award, {log = {desc = "actBattle", int1 = actid, int2 = count or 0}})
  536 + SendPacket(actionCodes.Activity_startBattleRpc, MsgPack.pack(role:packReward(reward, change)))
  537 +
  538 + if battleCfg.worldBoss_award ~= 0 and (bi["maxP"] or 0) > 0 then
  539 + bi["bossP"] = (bi["bossP"] or 0) + bi["maxP"] * count
  540 + end
  541 +
  542 + bi["sum"] = bi["sum"] + bi["top"]
  543 + actData["ticket"] = ticket - num
  544 + actData[id] = bi
  545 + changeFlag = true
  546 +
  547 + local rankVal = 0
  548 + if battleCfg.rank == 1 then
  549 + rankVal = bi["sum"]
  550 + elseif battleCfg.rank == 2 then
  551 + rankVal = bi["top"]
  552 + end
  553 + role:updateRankCommon(RANK_TYPE.ActBattleBoss, rankVal)
  554 + end
  555 + if changeFlag then
  556 + role.activity:updateActData("ChallengeLevel", actData)
  557 + end
  558 +
  559 + return true
  560 +end
  561 +
  562 +function _M.endBattleRpc(agent, data)
  563 + local role = agent.role
  564 + local msg = MsgPack.unpack(data)
  565 + local actid = msg.actid
  566 + local id = msg.id
  567 + local key = msg.key
  568 + local isWin = msg.isWin
  569 + local heros = msg.heros
  570 + local support = msg.support
  571 + if not role.activity:isOpenById(actid, "ChallengeLevel") then return 1 end
  572 +
  573 + if not role.__actBattleCache then return 2 end
  574 +
  575 + if role.__actBattleCache.id ~= id or role.__actBattleCache.key ~= key and role.__actBattleCache.actid ~= actid then
  576 + SendPacket(actionCodes.Activity_endBattleRpc, MsgPack.pack({errorCode = 1}))
  577 + end
  578 +
  579 + local actCfg = csvdb["activity_battleCsv"][actid]
  580 + if not actCfg then return 3 end
  581 +
  582 + local battleCfg = actCfg[id]
  583 + if not battleCfg then return 4 end
  584 +
  585 + local actData = role.activity:getActData("ChallengeLevel") or {}
  586 +
  587 + -- 总输出
  588 + local dmg = 0
  589 + for k, v in pairs(msg.info.damage) do
  590 + if k % 100 == 2 then
  591 + dmg = dmg + v
  592 + end
  593 + end
  594 +
  595 + local reward, change = {}, nil
  596 +
  597 + local battleInfo = actData[id] or {}
  598 + local curStar = 0
  599 + if isWin then
  600 + local herosInfo = msg.heros
  601 +
  602 + local check = {}
  603 + -- 1 通关
  604 + check[1] = function(_)
  605 + return true
  606 + end
  607 + -- 2 阵亡人数 <= N
  608 + check[2] = function(_, cond)
  609 + return msg.info.dead and msg.info.dead <= cond
  610 + end
  611 + -- 3 全员存活
  612 + check[3] = function(_)
  613 + return msg.info.dead and msg.info.dead == 0
  614 + end
  615 + -- 4 指定种族 >= N
  616 + check[4] = function(_, cond)
  617 + local count = 0
  618 + for _, one in pairs(herosInfo) do
  619 + local heroData = csvdb["unitCsv"][one.type]
  620 + if heroData.camp == cond then
  621 + count = count + 1
  622 + end
  623 + end
  624 + return count >= cond
  625 + end
  626 + -- 5 指定职业 >= N
  627 + check[5] = function(_, cond)
  628 + local count = 0
  629 + for _, one in pairs(herosInfo) do
  630 + local heroData = csvdb["unitCsv"][one.type]
  631 + if heroData.job == cond then
  632 + count = count + 1
  633 + end
  634 + end
  635 + return count >= cond
  636 + end
  637 + -- 6 含有指定角色
  638 + check[6] = function(_, cond)
  639 + for _, one in pairs(herosInfo) do
  640 + if one.type == cond then
  641 + return true
  642 + end
  643 + end
  644 + return false
  645 + end
  646 + -- 7 通关耗时 <= X 秒 msg.info.atime
  647 + check[7] = function(_, cond)
  648 + return msg.info.atime and msg.info.atime <= cond
  649 + end
  650 + -- 8 总输出值 msg.info.atime
  651 + check[8] = function(_, cond)
  652 + return dmg >= cond
  653 + end
  654 + curStar = 0
  655 + local sweepConds = battleCfg.sweep_condition:toTableArray(true)
  656 + for i, cond in ipairs(sweepConds) do
  657 + if check[cond[1]] and check[cond[1]](table.unpack(cond)) then
  658 + curStar = curStar + (1 << (i - 1))
  659 + end
  660 + end
  661 + else
  662 + curStar = 0
  663 + if battleCfg.rank ~= 0 then
  664 + curStar = 1
  665 + end
  666 + end
  667 + local oldStarNum = getStarCount(battleCfg, battleInfo["star"] or 0)
  668 + local newStarNum = getStarCount(battleCfg, curStar)
  669 + if newStarNum > oldStarNum then
  670 + battleInfo["star"] = curStar
  671 + end
  672 +
  673 + if battleCfg.rank ~= 0 and isWin then
  674 + -- 消耗门票
  675 + role.activity:getBattleTicket(actid)
  676 + local num = battleCfg.type:toArray(true, "=")[3]
  677 + actData["ticket"] = math.max(actData["ticket"] - num, 0)
  678 +
  679 + -- 更新排行榜 最高伤害
  680 + battleInfo["top"] = math.max(battleInfo["top"] or 0, dmg)
  681 + battleInfo["sum"] = (battleInfo["sum"] or 0) + dmg
  682 + local rankVal = 0
  683 + if battleCfg.rank == 1 then
  684 + rankVal = battleInfo["sum"]
  685 + elseif battleCfg.rank == 2 then
  686 + rankVal = battleInfo["top"]
  687 + end
  688 + if rankVal > 0 then
  689 + role:updateRankCommon(RANK_TYPE.ActBattleBoss, rankVal)
  690 + end
  691 + end
  692 +
  693 + if (oldStarNum == 0 and newStarNum > 0) or battleCfg.rank ~= 0 then
  694 + reward = battleCfg.item_clear:toNumMap()
  695 + end
  696 + if (oldStarNum < 3 and newStarNum == 3) or (battleCfg.rank ~= 0 and newStarNum == 3) then
  697 + local aw = battleCfg.perfect_reward:toNumMap()
  698 + for k, v in pairs(aw) do
  699 + reward[k] = (reward[k] or 0) + v
  700 + end
  701 + end
  702 +
  703 + role:checkBattle("act_battle", {
  704 + cfg = battleCfg,
  705 + star = newStarNum,
  706 + isWin = isWin,
  707 + info = msg.info,
  708 + reward = reward,
  709 + heros = heros,
  710 + supports = support,
  711 + })
  712 +
  713 + -- 解锁活动剧情
  714 + if newStarNum >= 3 then
  715 + role:checkStoryStatus(false, 5, id)
  716 + end
  717 +
  718 + if battleCfg.worldBoss_award ~= 0 and msg.point then
  719 + battleInfo["bossP"] = (battleInfo["bossP"] or 0) + msg.point
  720 + battleInfo["maxP"] = math.max(msg.point, (battleInfo["maxP"] or 0))
  721 + end
  722 + actData[id] = battleInfo
  723 + role.activity:updateActData("ChallengeLevel", actData)
  724 +
  725 + reward, change = role:award(reward, {log = {desc = "actBattle", int1 = actid, int2 = newStarNum}})
  726 +
  727 + SendPacket(actionCodes.Activity_endBattleRpc, MsgPack.pack({
  728 + reward = reward,
  729 + change = change
  730 + }))
  731 +
  732 + return true
  733 +end
  734 +
  735 +function _M.battleRankRpc(agent, data)
  736 + local role = agent.role
  737 + local msg = MsgPack.unpack(data)
  738 + local actid = msg.actid
  739 + local cfg = csvdb["activity_ctrlCsv"][actid]
  740 + if not cfg then return 1 end
  741 + if not role.activity:isOpen(cfg.showType) then return 2 end
  742 + local actTypeToRank = {
  743 + [role.activity.ActivityType.ChallengeLevel] = RANK_TYPE.ActBattleBoss,
  744 + [role.activity.ActivityType.Crisis] = RANK_TYPE.ActCrisis,
  745 + }
  746 + if not actTypeToRank[cfg.showType] then return end
  747 + local rankInfo = role:getRankInfoCommon(actTypeToRank[cfg.showType])
  748 + SendPacket(actionCodes.Activity_battleRankRpc, MsgPack.pack(rankInfo))
  749 + return true
  750 +end
  751 +
  752 +function _M.battleMilestoneRpc(agent, data)
  753 + local role = agent.role
  754 + local msg = MsgPack.unpack(data)
  755 + local actid = msg.actid
  756 + local id = msg.id
  757 + local index = msg.index
  758 +
  759 + if not role.activity:isOpenById(actid, "ChallengeLevel") then return 1 end
  760 +
  761 + local actCfg = csvdb["activity_mileageCsv"][actid]
  762 + if not actCfg then return 3 end
  763 +
  764 + local mileCfg = actCfg[index]
  765 + if not mileCfg then return 4 end
  766 +
  767 + local actData = role.activity:getActData("ChallengeLevel") or {}
  768 + local battleInfo = actData[id] or {}
  769 + local val = 0
  770 + if mileCfg.type == 1 then
  771 + val = battleInfo["sum"] or 0
  772 + elseif mileCfg.type == 2 then
  773 + val = battleInfo["top"] or 0
  774 + end
  775 +
  776 + local record = battleInfo["r"] or ""
  777 + local flag = string.char(string.getbit(record, index))
  778 + if flag == "1" then return 5 end
  779 + if mileCfg.condition > val then return 6 end
  780 +
  781 + battleInfo["r"] = string.setbit(record, index)
  782 + actData[id] = battleInfo
  783 + role.activity:updateActData("ChallengeLevel", actData)
  784 +
  785 + local award = mileCfg.reward:toNumMap()
  786 + local reward, change = role:award(award, {log = {desc = "actMilestone", int1 = actid, int2 = index}})
  787 + SendPacket(actionCodes.Activity_battleMilestoneRpc, MsgPack.pack(role:packReward(reward, change)))
  788 +
  789 + return true
  790 +end
  791 +
  792 +function _M.crisisMilestoneRpc(agent, data)
  793 + local role = agent.role
  794 + local msg = MsgPack.unpack(data)
  795 + local actid = msg.actid
  796 + local id = msg.id
  797 + if not role.activity:isOpenById(actid, "Crisis") then return 1 end
  798 + local actCfg = csvdb["activity_mileageCsv"][actid]
  799 + if not actCfg then return 3 end
  800 +
  801 + local curCsv = actCfg[id]
  802 + if not curCsv then return 4 end
  803 +
  804 + if role:getItemCount(ItemId.CrisisScore) < curCsv.condition then
  805 + return 5
  806 + end
  807 +
  808 + local actData = role.activity:getActData("Crisis") or {}
  809 + actData.score = actData.score or {}
  810 + if actData.score[id] then
  811 + return 6
  812 + end
  813 + actData.score[id] = -1
  814 + role.activity:updateActData("Crisis", actData)
  815 +
  816 + local reward, change = role:award(curCsv.reward, {log = {desc = "actMilecrisis", int1 = actid}})
  817 + SendPacket(actionCodes.Activity_crisisMilestoneRpc, MsgPack.pack(role:packReward(reward, change)))
  818 + return true
  819 +end
  820 +
  821 +
  822 +function _M.bossRewardRpc(agent, data)
  823 + local role = agent.role
  824 + local msg = MsgPack.unpack(data)
  825 + local actid = msg.actid
  826 + local id = msg.id
  827 + local index = msg.index
  828 +
  829 + if not role.activity:isOpenById(actid, "ChallengeLevel") then return 1 end
  830 +
  831 + local actCfg = csvdb["activity_battleCsv"][actid]
  832 + if not actCfg then return 2 end
  833 +
  834 + local battleCfg = actCfg[id]
  835 + if not battleCfg then return 3 end
  836 +
  837 + if battleCfg.worldBoss_award == 0 then return 4 end
  838 +
  839 + actCfg = csvdb["activity_wordboss_awardCsv"][battleCfg.worldBoss_award]
  840 + if not actCfg then return 5 end
  841 + local awardCfg = actCfg[index]
  842 + if not awardCfg then return 6 end
  843 +
  844 + local totalAwardCnt = #actCfg
  845 + local preList = awardCfg.condition1:toArray(true, "=")
  846 +
  847 + local actData = role.activity:getActData("ChallengeLevel") or {}
  848 + local battleInfo = actData[id] or {}
  849 + local bossPoint = battleInfo["bossP"] or 0
  850 + if bossPoint < 1 then return 7 end
  851 +
  852 + local bossRecord = battleInfo["bossR"] or ""
  853 + local r = string.char(string.getbit(bossRecord, index))
  854 + if r == "1" then
  855 + return 9
  856 + end
  857 + local ok = false
  858 + if #preList == 0 then
  859 + ok = true
  860 + else
  861 + for _, i in ipairs(preList) do
  862 + local flag = string.char(string.getbit(bossRecord, i))
  863 + if flag == "1" then
  864 + ok = true
  865 + break
  866 + end
  867 + end
  868 + end
  869 + if not ok then return 8 end
  870 +
  871 + battleInfo["bossR"] = string.setbit(bossRecord, index)
  872 + local allFinish = true
  873 + for i = 1, totalAwardCnt do
  874 + if string.char(string.getbit(battleInfo["bossR"], i)) == "0" then
  875 + allFinish = false
  876 + break
  877 + end
  878 + end
  879 + if allFinish then
  880 + battleInfo["bossR"] = ""
  881 + end
  882 + battleInfo["bossP"] = bossPoint - 1
  883 + actData[id] = battleInfo
  884 + role.activity:updateActData("ChallengeLevel", actData)
  885 +
  886 + local award = awardCfg.reward:toNumMap()
  887 + local reward, change = role:award(award, {log = {desc = "worldBossReward", int1 = actid, int2 = index}})
  888 + SendPacket(actionCodes.Activity_bossRewardRpc, MsgPack.pack(role:packReward(reward, change)))
  889 + return true
  890 +end
  891 +
266 892 return _M
267 893 \ No newline at end of file
... ...
src/actions/AdvAction.lua
... ... @@ -746,7 +746,7 @@ function _M.endBattleRpc(agent, data)
746 746 end
747 747 end
748 748 adv:mylog({desc = "endBattle"})
749   - local status = adv:clickBlock(roomId, blockId, {player = player, bySkill = bySkill})
  749 + local status = adv:clickBlock(roomId, blockId, {player = player, enemy = msg.enemy, bySkill = bySkill})
750 750  
751 751 if not status then return end
752 752 SendPacket(actionCodes.Adv_endBattleRpc, MsgPack.pack({events = adv:popBackEvents()}))
... ...
src/actions/CarAction.lua
... ... @@ -129,8 +129,8 @@ function _M.runeUpRpc( agent, data )
129 129 local runeData = runeSet[id]
130 130 if not runeData then return 5 end
131 131  
132   - local maxLv = #csvdb["rune_buildCsv"]
133   - if level >= maxLv then return 6 end
  132 + --local maxLv = #csvdb["rune_buildCsv"]
  133 + if level >= runeData.lvLimit then return 6 end
134 134 local lvData = csvdb["rune_buildCsv"][level]
135 135 local cost = lvData.cost:toNumMap()
136 136 if not role:checkItemEnough(cost) then
... ...
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/EmailAction.lua
... ... @@ -121,7 +121,7 @@ function _M.drawAttachRpc(agent, data)
121 121 local attachments = getEmailAttachments(email)
122 122 if attachments == "" then return end
123 123  
124   - local reward, change = role:award(attachments, {log = {desc = "draw_attach", int1 = emailId}})
  124 + local reward, change = role:award(attachments, {log = {desc = "draw_attach", int1 = id}})
125 125 email:setProperty("status", 2)
126 126 email:log(role, 2)
127 127 SendPacket(actionCodes.Email_drawAttachRpc, MsgPack.pack({reward = reward, change = change}))
... ...
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
... ... @@ -533,7 +548,9 @@ function _M.test(role, pms)
533 548 local id = tonum(pms.pm1, 0)
534 549 --local hero = require ("actions.HeroAction")
535 550 --hero.unlockPoolRpc({role = role}, MsgPack.pack({type = id}))
536   - print(role:getPaybackReward(0, 10000))
  551 +
  552 + --role:sendMail(13, nil, "1=2", {111})
  553 + dump(redisproxy:zrevrange("rank:tower", 0 , 10, "WITHSCORES"))
537 554 return "成功"
538 555 end
539 556  
... ...
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 通关
... ... @@ -632,7 +637,7 @@ function _M.endBonusBattleRpc(agent, data)
632 637 check[4] = function(_, cond)
633 638 local count = 0
634 639 for _, one in pairs(herosInfo) do
635   - local heroData = csv["unitCsv"][one.type]
  640 + local heroData = csvdb["unitCsv"][one.type]
636 641 if heroData.camp == cond then
637 642 count = count + 1
638 643 end
... ... @@ -643,7 +648,7 @@ function _M.endBonusBattleRpc(agent, data)
643 648 check[5] = function(_, cond)
644 649 local count = 0
645 650 for _, one in pairs(herosInfo) do
646   - local heroData = csv["unitCsv"][one.type]
  651 + local heroData = csvdb["unitCsv"][one.type]
647 652 if heroData.job == cond then
648 653 count = count + 1
649 654 end
... ... @@ -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,18 +481,14 @@ function _M.referEquipsRpc(agent, data)
477 481 -- 更新角色
478 482 hero:updateProperty({field = "equip", value = curEquip})
479 483  
480   - role:finishGuide(23)
481   -
482   - local curAttr = hero:getTotalAttrs()
483   - local attrChange = getChangeAttrJson(oldAttr, curAttr)
484 484 for typ, data in pairs(wear) do
485 485 role:log("equip_wear", {
486 486 hero_id = hero:getProperty("type"), --英雄ID
487 487 equip_id = data.id, --装备ID
488 488 equip_wear_action = data.act, --装备操作类型:装备:0,卸载:1
489 489 equip_wear_part = typ, --装备部位,记录部位ID
490   - equip_wear_result = curAttr, --装备操作后结果,记录属性变化,json格式记录,{“aa”:1234,"bb":4567}
491   - equip_wear_change = attrChange, --装备操作变化值,记录属性变化,记录正负值,json格式记录,{“aa”:1234,"bb":-45}
  490 + equip_wear_scorebef = oldBattleV, --装备前英雄评分
  491 + equip_wear_score = hero:getProperty("battleV"), --装备后英雄评分
492 492 equip_wear_mode = isAuto and 0 or 1, --用以区分自动装备还是手动装备,自动记录为0,手动记录为1
493 493 })
494 494 end
... ... @@ -585,16 +585,16 @@ function _M.createHeroRandomRpc(agent, data)
585 585 local itemData = csvdb["itemCsv"][itemId]
586 586 if not itemData or itemData.type ~= ItemType.HeroFCommon then return end
587 587 local cost = globalCsv.unit_fragment_cost[itemData.quality]
588   - if not cost or role:getItemCount(itemId) < cost then return end
  588 + if not cost or role:getItemCount(itemId) < cost then return 1 end
589 589  
590 590 local randomData = csvdb["item_randomCsv"][tonumber(itemData.use_effect)]
591   - if not randomData then return end
  591 + if not randomData then return 2 end
592 592  
593 593 local temp = randomData.gift1:randWeight(true)
594   - if not temp or not next(temp) then return end
  594 + if not temp or not next(temp) then return 3 end
595 595  
596 596 role:costItems({[itemId] = cost}, {log = {desc = "createHeroRandom"}})
597   - local reward, change = role:award({[temp[1] + ItemStartId.Hero] = 1}, {log = {desc = "createHeroRandom"}})
  597 + local reward, change = role:award({[temp[1]] = 1}, {log = {desc = "createHeroRandom"}})
598 598  
599 599  
600 600 SendPacket(actionCodes.Hero_createHeroRandomRpc, MsgPack.pack(role:packReward(reward, change)))
... ... @@ -604,7 +604,6 @@ end
604 604 function _M.getResetRewardRpc(agent, data)
605 605 local role = agent.role
606 606 local msg = MsgPack.unpack(data)
607   - local pay = msg.pay
608 607  
609 608 local hero = role.heros[msg.id]
610 609 if not hero then return end
... ... @@ -617,12 +616,30 @@ function _M.getResetRewardRpc(agent, data)
617 616 local tmpLevel = level
618 617 if level <= 1 and talent == "" then return end
619 618  
  619 + local pay = true
620 620 if level <= 60 then
621 621 pay = false
622 622 end
623 623  
624   - if pay and not role:costDiamond({count = globalCsv.unit_heroBack_cost or 200, log = {desc = "resetHero", int1 = msg.id}}) then
625   - return 1
  624 + if pay then
  625 + local costArr = globalCsv.unit_heroBack_cost:toArray(true, "=")
  626 + local itemCount = role:getItemCount(costArr[1])
  627 + local totalCost = {}
  628 + if itemCount >= costArr[2] then
  629 + totalCost[costArr[1]] = costArr[2]
  630 + else
  631 + local diamond = (costArr[2] - itemCount) * costArr[3]
  632 + if role:getItemCount(ItemId.Diamond) < diamond then
  633 + return 1
  634 + end
  635 + totalCost[costArr[1]] = itemCount
  636 + totalCost[ItemId.Diamond] = diamond
  637 + end
  638 +
  639 + --if pay and not role:costDiamond({count = globalCsv.unit_heroBack_cost or 200, log = {desc = "resetHero", int1 = msg.id}}) then
  640 + -- return 1
  641 + --end
  642 + role:costItems(totalCost, {log = {desc = "resetHero", int1 = msg.id}})
626 643 end
627 644  
628 645 local reward = {}
... ... @@ -677,10 +694,10 @@ function _M.getResetRewardRpc(agent, data)
677 694 })
678 695 hero:mylog({desc = "resetHero"})
679 696  
680   - local coef = globalCsv.unit_back_discount
681   - coef = (pay or tmpLevel <= 60) and 1 or coef
  697 + --local coef = globalCsv.unit_back_discount
  698 + --coef = (pay or tmpLevel <= 60) and 1 or coef
682 699 for itemId, count in pairs(reward) do
683   - reward[itemId] = math.floor(count * coef)
  700 + reward[itemId] = count
684 701 end
685 702 local change
686 703 reward, change = role:award(reward, {log = {desc = "resetHero", int1 = msg.id, int2 = hero:getProperty("type")}})
... ... @@ -697,13 +714,29 @@ end
697 714 function _M.drawHeroRpc(agent, data)
698 715 local role = agent.role
699 716 local msg = MsgPack.unpack(data)
  717 + local actid = msg.actid
700 718  
701 719 if not role:isFuncUnlock(FuncUnlock.GetHero) then return 1 end
702   - local btype = msg.pool -- 1 2 3 卡池类型
  720 + local btype = msg.pool -- 1 2 3 4 5 卡池类型 4新手卡池 5心愿卡池
703 721 local subType = msg.subType or 1-- 定向卡池需要传 子类型
704 722 local drawType = msg.type -- 1 单抽 2 十连
705 723 if btype ~= 1 then
706 724 subType = 1
  725 + if btype == 4 and role:getProperty("newerDraw") >= 10 then
  726 + subType = 2
  727 + if(role:getProperty("newerDraw") >= 30) then
  728 + return 30
  729 + end
  730 + end
  731 + end
  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
707 740 end
708 741  
709 742 if btype == 1 then
... ... @@ -711,6 +744,18 @@ function _M.drawHeroRpc(agent, data)
711 744 if not role.activity:isOpen("RaceDraw") then
712 745 return
713 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
714 759 end
715 760  
716 761 local buildTypeData = csvdb["build_typeCsv"][btype]
... ... @@ -724,23 +769,32 @@ function _M.drawHeroRpc(agent, data)
724 769  
725 770 -- 计算抽卡消耗品
726 771 local cost = {}
727   - local lastCount = drawCount[drawType]
728   - for _, costType in ipairs({"draw_card", "draw_coin"}) do
  772 + if buildTypeData["draw_coin_1"] == "" then
  773 + return 11
  774 + end
  775 + local diamondCost = buildTypeData["draw_coin_1"]:toArray(true, "=")
  776 +
  777 + local isEnough = true
  778 + for _, costType in ipairs({"draw_card_"}) do
  779 + costType = costType..drawCount[drawType]
729 780 if buildTypeData[costType] ~= "" then
730 781 local curCost = buildTypeData[costType]:toArray(true, "=")
731 782 local hadCount = role:getItemCount(curCost[1])
732   - local curCount = math.floor(hadCount / curCost[2])
733   - if curCount >= lastCount then
734   - cost[curCost[1]] = curCost[2] * lastCount
735   - lastCount = 0
  783 + if hadCount >= curCost[2] then
  784 + cost[curCost[1]] = curCost[2]
736 785 break
737   - elseif curCount > 0 then
738   - cost[curCost[1]] = curCost[2] * curCount
739   - lastCount = lastCount - curCount
  786 + else
  787 + cost[curCost[1]] = hadCount
  788 + diamondCost[2] = (curCost[2] - hadCount) * diamondCost[2]
  789 + if not role:checkItemEnough({[diamondCost[1]]=diamondCost[2]}) then
  790 + isEnough = false
  791 + break
  792 + end
  793 + cost[diamondCost[1]] = diamondCost[2]
740 794 end
741 795 end
742 796 end
743   - if lastCount > 0 then -- 钱不够
  797 + if isEnough == false then -- 钱不够
744 798 return 4
745 799 end
746 800  
... ... @@ -803,6 +857,9 @@ function _M.drawHeroRpc(agent, data)
803 857 --print(poolId, rand_v, weight, up_pool, values[1])
804 858 if rand_v < weight and up_pool then
805 859 up_pool = up_pool:toArray(true, "=")
  860 + if btype == 5 then -- 爱心卡池,使用玩家设置的备选池子
  861 + up_pool = role:getProperty("wishPool")
  862 + end
806 863 for k, v in ipairs(up_pool) do
807 864 resultPool[v] = {1}
808 865 end
... ... @@ -868,8 +925,14 @@ function _M.drawHeroRpc(agent, data)
868 925 end
869 926 end
870 927  
871   - if itemData.quality >= HeroQuality.SR then
872   - floorHeroCount = 0
  928 + if btype == 4 and role:getProperty("newerDraw") == 0 then -- 新手卡池
  929 + if itemData.quality == HeroQuality.SSR then
  930 + floorHeroCount = 0
  931 + end
  932 + else
  933 + if itemData.quality >= HeroQuality.SR then
  934 + floorHeroCount = 0
  935 + end
873 936 end
874 937  
875 938 if role:isHaveHero(itemData.id - ItemStartId.Hero) then
... ... @@ -892,6 +955,11 @@ function _M.drawHeroRpc(agent, data)
892 955 role:setProperty("floorHero", floorHero)
893 956 end
894 957  
  958 + if btype == 4 then
  959 + local newCount = role:getProperty("newerDraw")
  960 + role:updateProperty({field="newerDraw", value = newCount + drawCount[drawType]})
  961 + end
  962 +
895 963 role:checkTaskEnter("DrawHero", {pool = btype, count = drawCount[drawType]})
896 964 if ssrCount > 0 then
897 965 role:checkTaskEnter("DrawSSR", {count = ssrCount})
... ... @@ -904,16 +972,21 @@ function _M.drawHeroRpc(agent, data)
904 972 gacha_up = 0, -- 卡池UP角色
905 973 gacha_times = drawCount[drawType], -- 抽卡次数
906 974 gacha_reward = logReward, -- 抽卡结果,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
907   - currency = cost, -- 购买道具消耗的货币
  975 + gacha_cost = cost, -- 购买道具消耗的货币
908 976 gacha_cnt = floorHeroCount,
909 977 })
910 978 SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组
911 979  
912   - if btype == 1 or btype == 2 then
  980 + local feedbackId = buildTypeData["can_feedback"] or 0
  981 + if feedbackId ~= 0 then
913 982 -- 达到一定次数,给响应奖励
914 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
915 988 local newVal = oldVal + drawCount[drawType]
916   - local drawCardReward, val = role:getDrawCardExtraReward(oldVal, newVal)
  989 + local drawCardReward, val = role:getDrawCardExtraReward(feedbackId, oldVal, newVal)
917 990 -- 空字符穿代表直接给英雄 走以前repayHeroRpc
918 991 if drawCardReward == "" then
919 992 local repayHeroMaxCount = role:getProperty("repayMaxC") or 0
... ... @@ -923,11 +996,11 @@ function _M.drawHeroRpc(agent, data)
923 996 local even = repayHeroMaxCount % 2
924 997 local id = 0
925 998 if even == 1 then
926   - id = math.randWeight(csvdb["build_giftCsv"], "pool_1")
  999 + id = math.randWeight(csvdb["build_giftCsv"], "pool_"..feedbackId)
927 1000 else
928 1001 local giftHeroSet = {}
929 1002 for gid, cfg in pairs(csvdb["build_giftCsv"]) do
930   - 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
931 1004 giftHeroSet[gid] = {1}
932 1005 end
933 1006 end
... ... @@ -936,7 +1009,7 @@ function _M.drawHeroRpc(agent, data)
936 1009 end
937 1010 end
938 1011 if id == 0 then
939   - id = math.randWeight(csvdb["build_giftCsv"], "pool_1")
  1012 + id = math.randWeight(csvdb["build_giftCsv"], "pool_"..feedbackId)
940 1013 end
941 1014  
942 1015 local r,change = {}
... ... @@ -956,7 +1029,13 @@ function _M.drawHeroRpc(agent, data)
956 1029 r, change = role:award(drawCardReward, {log = {desc = "drawHeroExtraReward", int1 = oldVal, int2 = newVal}})
957 1030 SendPacket(actionCodes.Hero_drawHeroExtraRewardNtf, MsgPack.pack(role:packReward(r, change)))
958 1031 end
959   - 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
960 1039 end
961 1040 return true
962 1041 end
... ... @@ -1049,6 +1128,9 @@ function _M.itemComposeRpc(agent, data)
1049 1128 if not config then return 2 end
1050 1129  
1051 1130 local cost = config.cost:toNumMap()
  1131 + for k, v in pairs(cost) do
  1132 + cost[k] = v * count
  1133 + end
1052 1134 if not role:checkItemEnough(cost) then return 2 end
1053 1135 role:costItems(cost, {log = {desc = "itemCompose", int1 = itemId, int2 = count}})
1054 1136 role:award({[itemId] = count}, {log = {desc = "itemCompose"}})
... ... @@ -1057,4 +1139,32 @@ function _M.itemComposeRpc(agent, data)
1057 1139 return true
1058 1140 end
1059 1141  
  1142 +function _M.setWishPoolRpc(agent, data)
  1143 + local role = agent.role
  1144 + local msg = MsgPack.unpack(data)
  1145 +
  1146 + local heros = msg.heros
  1147 + if #heros > 3 then return 1 end
  1148 +
  1149 + for _, heroId in pairs(heros) do
  1150 + local cfg = csvdb["build_poolCsv"][heroId]
  1151 + if not cfg then return 2 end
  1152 +
  1153 + local buildTypeData = csvdb["build_typeCsv"][5]
  1154 + if not buildTypeData then return 3 end
  1155 + local poolMap = buildTypeData["pool"]:toNumMap()
  1156 + local poolId = poolMap[1]
  1157 + if not poolId then return 4 end
  1158 +
  1159 + if cfg["pool_"..poolId] == 0 then
  1160 + return 5
  1161 + end
  1162 + end
  1163 +
  1164 + role:updateProperty({field="wishPool", value = heros})
  1165 +
  1166 + SendPacket(actionCodes.Hero_setWishPoolRpc, "")
  1167 + return true
  1168 +end
  1169 +
1060 1170 return _M
... ...
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
... ... @@ -23,6 +23,7 @@ local _revengeRecord = {} -- 复仇对单人1分钟间隔
23 23 local RevengeWaitTime = 60
24 24  
25 25 function _M.formatCommonRpc(agent , data)
  26 + if true then return end
26 27 local role = agent.role
27 28 local roleId = role:getProperty("id")
28 29 local msg = MsgPack.unpack(data)
... ... @@ -63,7 +64,8 @@ function _M.formatHighRpc(agent , data)
63 64 local role = agent.role
64 65 local roleId = role:getProperty("id")
65 66 local msg = MsgPack.unpack(data)
66   -
  67 +
  68 + if not role:isCrossServerPvpPlayer() then return end
67 69 local pvpTH = {}
68 70 local had = {} -- 上阵的角色
69 71 local supportHad = {}
... ... @@ -133,7 +135,7 @@ local function getMatchInfo(role, pvpList, battleCache, dbKey, infoFuncName, inf
133 135 if k == "battleInfo" then
134 136 battleCache[curInfo.roleId] = v
135 137 else
136   - if (k == "heros" or k == "battleV") and infoCache then
  138 + if (k == "team" or k == "battleV") and infoCache then
137 139 infoCache[curInfo.roleId] = infoCache[curInfo.roleId] or {}
138 140 infoCache[curInfo.roleId][k] = v
139 141 end
... ... @@ -169,7 +171,7 @@ function _M.infoRpc(agent, data)
169 171  
170 172 local pvpMC = role:getProperty("pvpMC")
171 173 if not next(pvpMC) then --没有分配过对手
172   - role:refreshPvpMatchC(score)
  174 + role:refreshPvpMatchC(score, -1)
173 175 pvpMC = role:getProperty("pvpMC")
174 176 end
175 177 if not next(pvpMC) then return end
... ... @@ -189,7 +191,7 @@ function _M.infoRpc(agent, data)
189 191  
190 192 local pvpMH = role:getProperty("pvpMH")
191 193 if not next(pvpMH) then --没有分配过对手
192   - role:refreshPvpMatchH(score)
  194 + role:refreshPvpMatchH(score, -1)
193 195 pvpMH = role:getProperty("pvpMH")
194 196 end
195 197 if not next(pvpMH) then return end
... ... @@ -255,8 +257,38 @@ function _M.startBattleRpc(agent, data)
255 257 local idx = msg.idx
256 258 local revenge = msg.revenge
257 259  
258   - local pvpTC = role:getProperty("pvpTC")
259   - if not pvpTC.heros or not next(pvpTC.heros) then return 1 end
  260 + -- local pvpTC = role:getProperty("pvpTC")
  261 + -- if not pvpTC.heros or not next(pvpTC.heros) then return 1 end
  262 +
  263 + local team = msg.team
  264 + if not team then return end
  265 +
  266 + for slot, heroId in pairs(team.heros or {}) do
  267 + if not role.heros[heroId] then
  268 + return
  269 + end
  270 + end
  271 + if not team.heros or not next(team.heros) then
  272 + return
  273 + end
  274 + local supports = {}
  275 + for slot, support in pairs(team.supports) do
  276 + if slot ~= 1 and slot ~= 2 then return end
  277 + local level = role.dinerData:getProperty("dishTree"):getv(support, 0)
  278 + if level <= 0 then return end
  279 + supports[slot] = support
  280 + end
  281 +
  282 + local pvpTC = {}
  283 + pvpTC.heros = {}
  284 + for slot, heroId in pairs(team.heros) do
  285 + pvpTC.heros[slot] = heroId
  286 + end
  287 + pvpTC.leader = team.leader
  288 + pvpTC.supports = supports
  289 + if team.tactics and globalCsv.tactics_skill_passive_cell[team.tactics] then
  290 + pvpTC.tactics = team.tactics
  291 + end
260 292  
261 293 local matchInfo, result, key, wait
262 294  
... ... @@ -299,7 +331,7 @@ function _M.startBattleRpc(agent, data)
299 331 end
300 332  
301 333 key = tostring(math.random())
302   - _pvpStartBattleCacheC = {idx = idx, key = key, revenge = revenge}
  334 + _pvpStartBattleCacheC = {idx = idx, key = key, revenge = revenge, pvpTC = pvpTC}
303 335  
304 336 role:checkTaskEnter("PvpBattle")
305 337  
... ... @@ -342,7 +374,15 @@ function _M.endBattleRpc(agent, data)
342 374  
343 375 local temp = string.randWeight(csvdb["player_expCsv"][role:getProperty("level")].pvpBonus, true)
344 376 local reward, change = role:award({[temp[1]] = temp[2]}, {log = {desc = "pvpBattleC"}})
345   - local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = role:changePvpScoreCommon(match.t == 1 and match.id or -1, isWin)
  377 + local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = 0, 0, 0, 0, -1, -1
  378 + -- 失败了没再排行榜 不计入
  379 + if isWin or (not isWin and role:isInPvpRank(RANK_PVP_COMMON)) then
  380 + myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank= role:changePvpScoreCommon(match.t == 1 and match.id or -1, isWin)
  381 + end
  382 + if isWin then
  383 + -- 记录编队
  384 + role:savePvpCTeam(_pvpStartBattleCacheC.pvpTC)
  385 + end
346 386  
347 387 -- 请求上传录像
348 388 local params = {
... ... @@ -433,8 +473,8 @@ function _M.startBattleHRpc(agent, data)
433 473 local revenge = msg.revenge
434 474 if not role:isTimeResetOpen(TimeReset.PvpHight) then return end
435 475  
436   - local pvpTH = role:getProperty("pvpTH")
437   - if not next(pvpTH) then return 1 end
  476 + -- local pvpTH = role:getProperty("pvpTH")
  477 + -- if not next(pvpTH) then return 1 end
438 478  
439 479 -- 检查并记录玩家队伍
440 480 local pvpTH = {}
... ... @@ -472,7 +512,6 @@ function _M.startBattleHRpc(agent, data)
472 512 curTeam.tactics = team.tactics
473 513 end
474 514  
475   -
476 515 table.insert(pvpTH, curTeam)
477 516 end
478 517  
... ... @@ -644,9 +683,18 @@ function _M.endBattleHRpc(agent, data)
644 683 -- 战斗结束了发奖
645 684 local temp = string.randWeight(csvdb["player_expCsv"][role:getProperty("level")].pvpgroupBonus, true)
646 685 local reward, change = role:award({[temp[1]] = temp[2]}, {log = {desc = "pvpBattleH"}})
647   - local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = 0, 0, 0, 0, 0, 0
648   - if role:isTimeResetOpen(TimeReset.PvpHight) then
649   - myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = role:changePvpScoreHigh(match.t == 1 and match.id or -1, isWin)
  686 +
  687 +
  688 + local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = 0, 0, 0, 0, -1, -1
  689 + -- 失败了没再排行榜 不计入
  690 + if role:isTimeResetOpen(TimeReset.PvpHight) then
  691 + if isWin or (not isWin and role:isInPvpRank(RANK_PVP_HIGHT)) then
  692 + myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = role:changePvpScoreHigh(match.t == 1 and match.id or -1, isWin)
  693 + end
  694 + -- 记录编队
  695 + if isWin then
  696 + role:savePvpHTeam(_pvpStartBattleCacheH.pvpTH)
  697 + end
650 698 end
651 699  
652 700 -- 加入战斗记录
... ... @@ -657,12 +705,12 @@ function _M.endBattleHRpc(agent, data)
657 705 info.winId = info.isWin and roleId or match.id
658 706 info.isWin = nil
659 707 selfTeam[_idx] = {
660   - heros = role:getTeamHerosInfo(_pvpStartBattleCacheH.pvpTH[_idx].heros),
  708 + team = role:getTeamHerosInfo(_pvpStartBattleCacheH.pvpTH[_idx]),
661 709 battleV = role:getTeamBattleValue(_pvpStartBattleCacheH.pvpTH[_idx].heros)
662 710 }
663 711 if match.t == 1 and _pvpStartBattleCacheH.enemyT then
664 712 enemyTeam[_idx] = {
665   - heros = _pvpStartBattleCacheH.enemyT["heros"][_idx],
  713 + team = _pvpStartBattleCacheH.enemyT["team"][_idx],
666 714 battleV = _pvpStartBattleCacheH.enemyT["battleV"][_idx]
667 715 }
668 716 end
... ... @@ -735,6 +783,7 @@ function _M.endBattleHRpc(agent, data)
735 783 myRank = myRank,
736 784 oldMyRank = oldMyRank,
737 785 video = video,
  786 + headers = headers,
738 787 isWin = isWin,
739 788 }))
740 789 return true
... ...
src/actions/RadioAction.lua
... ... @@ -69,7 +69,7 @@ function _M.startQuestRpc(agent, data)
69 69 needHeroCnt = it[2]
70 70 end
71 71 end
72   - for _, heroId in ipairs(heros) do
  72 + for _, heroId in pairs(heros) do
73 73 local hero = role.heros[heroId]
74 74 if hero then
75 75 needHeroCnt = needHeroCnt - 1
... ... @@ -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  
... ... @@ -122,7 +141,7 @@ function _M.finishQuestRpc(agent, data)
122 141 -- get heros
123 142 local totalCoef = 0
124 143 local exp = config.time / 60
125   - heroFaithMap = {}
  144 + local heroFaithMap = {}
126 145 for _, heroId in ipairs(task.heros) do
127 146 local hero = role.heros[heroId]
128 147 if hero then
... ... @@ -158,8 +177,45 @@ 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  
  205 +function _M.cancelQuestRpc(agent, data)
  206 + local role = agent.role
  207 + local msg = MsgPack.unpack(data)
  208 + local id = msg.id
  209 + -- check finish time
  210 + local radioTask = role:getProperty("radioTask")
  211 + local task = radioTask[id]
  212 + if not task then return 1 end
  213 + if skynet.timex() > task.time then return 2 end
  214 + radioTask[id] = nil
  215 + role:updateProperty({field="radioTask", value=radioTask, notNotify = true})
  216 +
  217 + SendPacket(actionCodes.Radio_cancelQuestRpc, MsgPack.pack({id = id}))
  218 + return true
  219 +end
  220 +
165 221 return _M
166 222 \ No newline at end of file
... ...
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}})
569 622 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   - -- 随机奖励
  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
  640 + end
  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
... ... @@ -1279,4 +1369,16 @@ function _M.renameTeamRpc(agent, data)
1279 1369 return true
1280 1370 end
1281 1371  
  1372 +function _M.accuseRpc(agent, data)
  1373 + local role = agent.role
  1374 + local msg = MsgPack.unpack(data)
  1375 + local targetId = msg.targetId
  1376 + local atype = msg.type
  1377 + local note = msg.note
  1378 +
  1379 + role:mylog("role_action", {desc = "accuse", int1 = targetId, short1 = atype, text1 = note})
  1380 + SendPacket(actionCodes.Role_accuseRpc, "")
  1381 + return true
  1382 +end
  1383 +
1282 1384 return _M
1283 1385 \ No newline at end of file
... ...
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  
... ... @@ -474,4 +477,30 @@ function _M.getExploreCommandRewardRpc(agent, data)
474 477 return true
475 478 end
476 479  
  480 +-- 累充奖励
  481 +function _M.getTotalRechargeAwardRpc(agent, data)
  482 + local role = agent.role
  483 + local msg = MsgPack.unpack(data)
  484 + local index = msg.index -- 领取的索引id
  485 + local totalTwd = role:getProperty("twdC")
  486 + local totalRechargeRecord = role.storeData:getProperty("totalRR")
  487 + local flag = string.char(string.getbit(totalRechargeRecord, index))
  488 + if flag == "1" then return 1 end
  489 + local cfg = csvdb["activity_payRebateCsv"][index]
  490 + if not cfg then return 2 end
  491 + if cfg.twd > totalTwd then return 3 end
  492 +
  493 + totalRechargeRecord = string.setbit(totalRechargeRecord, index)
  494 + role.storeData:updateProperty({field = "totalRR", value = totalRechargeRecord})
  495 + local main = cfg.main_reward:toNumMap()
  496 + local sub = cfg.sub_reward:toNumMap()
  497 + for k, v in pairs(sub) do
  498 + main[k] = (main[k] or 0) + v
  499 + end
  500 +
  501 + local reward, change = role:award(main, {log = {desc = "totalRecharge", int1 = index}})
  502 + SendPacket(actionCodes.Store_getTotalRechargeAwardRpc, MsgPack.pack(role:packReward(reward, change)))
  503 + return true
  504 +end
  505 +
477 506 return _M
478 507 \ No newline at end of file
... ...
src/adv/Adv.lua
... ... @@ -58,7 +58,7 @@ function Adv:initByInfo(advInfo)
58 58 self.maps[id] = AdvMap.new(self, id, map)
59 59 end
60 60  
61   - self:initBattle()
  61 + self:initBattle(advInfo)
62 62 end
63 63 -- 找出level 是否存在中继层
64 64 function Adv:isHaveRelay(level, chapterId)
... ... @@ -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(true)
  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(notDb)
  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,13 +470,15 @@ function Adv:initBattle(notDb)
468 470 map:initBattleAfter()
469 471 end
470 472 --下层
471   - if notDb and self.level ~= 1 then
  473 + if not info and isToNext then
472 474 self.battle.player:attrChangeCondBuffCheck(1)
473 475 end
474 476  
475 477 -- 初始化
476   - if notDb then
  478 + if not info then
477 479 self.battle:newBattle()
  480 + else
  481 + self.battle:loadBattle(info)
478 482 end
479 483 end
480 484  
... ... @@ -818,17 +822,17 @@ function Adv:over(success, rewardRatio, overType)
818 822 lv = self.owner:getProperty("level"),
819 823 batteV = self.owner:getTeamBattleValue(team.heros),
820 824 chapter = self.chapterId,
821   - format = self.owner:getTeamHerosInfo(team.heros),
  825 + format = self.owner:getTeamHerosInfo(team).heros,
822 826 }
823 827 redisproxy:pipelining(function (red)
824 828 red:zadd(self.owner:getAdvRankKey(), score, roleId) --更新分数
825 829 red:hset(RANK_ADV_INFO, roleId, MsgPack.pack(curInfo))
826 830 end)
827 831 end
828   - -- 通关的时候要把引导步骤设定到成就引导
829   - if not self.owner:checkOverGuide(57) then
830   - self.owner:saveGuide(57,1,true)
831   - end
  832 + end
  833 + -- 通关的时候要把引导步骤设定到成就引导
  834 + if not self.owner:checkOverGuide(57) then
  835 + self.owner:saveGuide(57,1,true)
832 836 end
833 837 self:clearAdvUnlockCache()
834 838  
... ... @@ -1092,10 +1096,10 @@ local function clickOut(self, room, block, params, isExit)
1092 1096 end
1093 1097  
1094 1098 if #self.mapStack > 1 then -- 处于夹层中
  1099 + self:backLayer(-1)
1095 1100 local oldMapIdx = self:getCurMapIdx()
1096 1101 table.remove(self.mapStack) --退出夹层
1097 1102 self.battle:iLayerChange(oldMapIdx)
1098   - self:backLayer(-1)
1099 1103 else --处于底层
1100 1104  
1101 1105 local advPass = self.owner:getProperty("advPass")
... ... @@ -1127,8 +1131,8 @@ local function clickOut(self, room, block, params, isExit)
1127 1131 if curFloorData then
1128 1132 self:award({[ItemId.AdvPoint] = curFloorData.exp}, {log = {desc = "passReward", int1 = self.chapterId, int2 = self.level}}, {})
1129 1133 end
  1134 + self:backNext() --下一关
1130 1135 local isHaveRelay = self:isHaveRelay(self.level)
1131   -
1132 1136 if isHaveRelay and not self.isRelay then
1133 1137 self:initByChapter({
1134 1138 chapterId = self.chapterId,
... ... @@ -1146,7 +1150,6 @@ local function clickOut(self, room, block, params, isExit)
1146 1150 notNotify = true,
1147 1151 })
1148 1152 end
1149   - self:backNext() --下一关
1150 1153 end
1151 1154  
1152 1155 end
... ... @@ -1386,19 +1389,31 @@ local function chooseCommon(self, room, block, chooseData, choose, tag)
1386 1389 [14] = function() -- 指定地块召唤 指定类型的id
1387 1390 local change = self:getCurMap():layEventToStage(effect[2], effect[3], effect[4], effect[5])
1388 1391 for _, one in ipairs(change) do
1389   - self:backBlockChange(one[1].roomId, one[2].blockId)
  1392 + if one[1].roomId == room.roomId and one[2].blockId == block.blockId then
  1393 + clearBlock = false
  1394 + else
  1395 + self:backBlockChange(one[1].roomId, one[2].blockId)
  1396 + end
1390 1397 end
1391 1398 end,
1392 1399 [15] = function() -- 移除指定事件
1393 1400 local change = self:getCurMap():clearEventById(effect[2], effect[3], effect[4])
1394 1401 for _, one in ipairs(change) do
1395   - self:backBlockChange(one[1].roomId, one[2].blockId)
  1402 + if one[1].roomId == room.roomId and one[2].blockId == block.blockId then
  1403 + clearBlock = false
  1404 + else
  1405 + self:backBlockChange(one[1].roomId, one[2].blockId)
  1406 + end
1396 1407 end
1397 1408 end,
1398 1409 [16] = function() -- 指定事件转移
1399 1410 local change = self:getCurMap():eventChangeToOther(effect[2], effect[3], effect[4], effect[5], effect[6])
1400 1411 for _, one in ipairs(change) do
1401   - self:backBlockChange(one[1].roomId, one[2].blockId)
  1412 + if one[1].roomId == room.roomId and one[2].blockId == block.blockId then
  1413 + clearBlock = false
  1414 + else
  1415 + self:backBlockChange(one[1].roomId, one[2].blockId)
  1416 + end
1402 1417 end
1403 1418 end,
1404 1419 }
... ... @@ -1524,6 +1539,25 @@ local function clickBuild(self, room, block, params)
1524 1539 local status, clearBlock = chooseCommon(self, room, block, chooseData, choose, "build")
1525 1540 if not status then return end
1526 1541  
  1542 + local isMine = false -- 是不是宝藏怪
  1543 + for _, mid in ipairs(globalCsv.adv_egg_treasureLayer_id) do
  1544 + if mid == oldId then
  1545 + isMine = true
  1546 + break
  1547 + end
  1548 + end
  1549 + if isMine then
  1550 + local advMine = self.owner:getProperty("advMine")
  1551 + advMine[2] = advMine[2] or {}
  1552 + local mineCo2 = advMine[2].co or {}
  1553 + if chooseData.limit ~= 0 then
  1554 + mineCo2[oldId] = (mineCo2[oldId] or 0) + 1
  1555 + end
  1556 + advMine[2].co = mineCo2
  1557 + self.owner:setProperty("advMine", advMine)
  1558 + self.owner:checkTaskEnter("AdvMineLayer")
  1559 + end
  1560 +
1527 1561 self:checkTask(Adv.TaskType.Build, 1, oldId)
1528 1562 self:checkAchievement(Adv.AchievType.Build, 1, oldId)
1529 1563 self:checkAchievement(Adv.AchievType.BuildBySelect, 1, oldId, choose)
... ... @@ -1572,6 +1606,7 @@ end
1572 1606  
1573 1607 local function clickLayer(self, room, block, params)
1574 1608 local oldMapIdx = self:getCurMapIdx()
  1609 + self:backLayer(1)
1575 1610 if block.event.mapIdx then
1576 1611 table.insert(self.mapStack, block.event.mapIdx) --进入夹层
1577 1612 else
... ... @@ -1588,7 +1623,6 @@ local function clickLayer(self, room, block, params)
1588 1623 self:checkAchievement(Adv.AchievType.EnterILayer, 1, mapId)
1589 1624 end
1590 1625 self.battle:iLayerChange(oldMapIdx)
1591   - self:backLayer(1)
1592 1626 return true
1593 1627 end
1594 1628  
... ... @@ -1951,73 +1985,144 @@ function Adv:enemyDead(enemy, escape)
1951 1985 -- self:backDead(enemyId, changeV)
1952 1986 self:backDead(enemyId)
1953 1987  
1954   - local toClick = enemy:hadBuff(Buff.CHANGE_DROP_TO_CLICK)
1955   - if toClick then
1956   - toClick = toClick:effect()
  1988 + local isMine = false -- 是不是宝藏怪
  1989 + for _, mid in ipairs(globalCsv.adv_egg_treasureMonster_id) do
  1990 + if mid == enemyId then
  1991 + isMine = true
  1992 + break
  1993 + end
1957 1994 end
1958 1995  
1959   - local changItem = enemy:hadBuff(Buff.CHANGE_DROP)
1960   - if changItem then
1961   - changItem = table.pack(changItem:effect())
1962   - end
  1996 + if isMine then
  1997 + local advMine = self.owner:getProperty("advMine")
  1998 + advMine[1] = advMine[1] or {}
  1999 + advMine[2] = advMine[2] or {}
  2000 + local mineCo = advMine[1].co or {}
  2001 + local mineCo2 = advMine[2].co or {}
  2002 + local mineCh = advMine[2].ch or globalCsv.adv_egg_treasureLayer_showup
  2003 + if monsterData.limit ~= 0 then
  2004 + mineCo[enemyId] = (mineCo[enemyId] or 0) + 1
  2005 + end
1963 2006  
1964   - local addMult = 0
1965   - local dropBuff = enemy:hadBuff(Buff.DROP_BUFF_BY_ENEMY) -- 根据敌人数量变化个数
1966   - if dropBuff then
1967   - local team = enemy:getTeam(1, true)
1968   - addMult = addMult + 0.2 * #team
1969   - end
  2007 + local had = false
  2008 + if math.randomInt(1, 100) <= mineCh then -- 刷出来了
  2009 + local mpool = {}
  2010 + for _, mid in ipairs(globalCsv.adv_egg_treasureLayer_id) do
  2011 + local layer = csvdb["event_buildingCsv"][mid]
  2012 + if (not mineCo2[mid] or layer.limit == 0 or mineCo2[mid] < layer.limit) and layer.showup > 0 then
  2013 + mpool[mid] = {layer.showup}
  2014 + end
  2015 + end
  2016 + if next(mpool) then
  2017 + local cId = math.randWeight(mpool, 1)
  2018 + block:updateEvent({
  2019 + etype = AdvEventType.Build,
  2020 + id = cId
  2021 + })
  2022 + had = true
  2023 + end
  2024 + end
  2025 + if had then
  2026 + mineCh = nil
  2027 + else
  2028 + block:clear()
  2029 + mineCh = math.min(mineCh + globalCsv.adv_egg_treasureLayer_showup_add, 100)
  2030 + end
1970 2031  
1971   - local dropIds = monsterData.dropid:toArray(true, "=")
1972   - local drops = {}
1973   - local cCcount = 0 -- 需要改变为click 的个数
1974   - for _, dropId in ipairs(dropIds) do
1975   - local dropData = csvdb["event_dropCsv"][dropId]
1976   - if dropData then
1977   - local cur = dropData["range"]:randWeight(true)
1978   - if cur and cur[1] ~= 0 then
1979   - if toClick then
1980   - cCcount = cCcount + 1
1981   - else
1982   - local item = changItem and changItem or cur
1983   - item[2] = math.floor(item[2] * (1 + addMult))
1984   - drops[#drops + 1] = item
  2032 + local drops = {}
  2033 + for _, dropId in ipairs(monsterData.dropid:toArray(true, "=")) do
  2034 + local dropData = csvdb["event_dropCsv"][dropId]
  2035 + if dropData then
  2036 + local cur = dropData["range"]:randWeight(true)
  2037 + if cur and cur[1] ~= 0 then
  2038 + drops[#drops + 1] = cur
1985 2039 end
1986 2040 end
1987 2041 end
1988   - end
1989   - -- 这些奖励可能会有被动加成
1990   - self.battle.player:triggerPassive(Passive.BATTLE_WIN, {drops = drops})
  2042 + local blocks = self:getCurMap():getEmptyBlocks(roomId, blockId, #drops)
  2043 + for _i, cblock in ipairs(blocks) do
  2044 + cblock:updateEvent({
  2045 + etype = AdvEventType.Drop,
  2046 + item = drops[_i]
  2047 + })
  2048 + if cblock ~= block then
  2049 + self:backBlockChange(cblock.room.roomId, cblock.blockId)
  2050 + end
  2051 + end
  2052 + advMine[1].co = mineCo
  2053 + advMine[2].co = mineCo2
  2054 + advMine[2].ch = mineCh
  2055 + self.owner:setProperty("advMine", advMine)
  2056 + self.owner:checkTaskEnter("AdvMineKill")
  2057 + else
  2058 + local toClick = enemy:hadBuff(Buff.CHANGE_DROP_TO_CLICK)
  2059 + if toClick then
  2060 + toClick = toClick:effect()
  2061 + end
1991 2062  
1992   - -- 自身带的掉落是不会被改变的 也不会被加成
1993   - if block.event.item and block.event.item[1] ~= 0 then
1994   - table.insert(drops, 1, block.event.item)
1995   - end
  2063 + local changItem = enemy:hadBuff(Buff.CHANGE_DROP)
  2064 + if changItem then
  2065 + changItem = table.pack(changItem:effect())
  2066 + end
1996 2067  
1997   - -- 清空当前的格子
1998   - block:clear()
  2068 + local addMult = 0
  2069 + local dropBuff = enemy:hadBuff(Buff.DROP_BUFF_BY_ENEMY) -- 根据敌人数量变化个数
  2070 + if dropBuff then
  2071 + local team = enemy:getTeam(1, true)
  2072 + addMult = addMult + 0.2 * #team
  2073 + end
1999 2074  
2000   - -- 掉落走一波
2001   - local blocks = self:getCurMap():getEmptyBlocks(roomId, blockId, #drops)
2002   - for _i, cblock in ipairs(blocks) do
2003   - cblock:updateEvent({
2004   - etype = AdvEventType.Drop,
2005   - item = drops[_i]
2006   - })
2007   - if cblock ~= block then
2008   - self:backBlockChange(cblock.room.roomId, cblock.blockId)
  2075 + local dropIds = monsterData.dropid:toArray(true, "=")
  2076 + local drops = {}
  2077 + local cCcount = 0 -- 需要改变为click 的个数
  2078 + for _, dropId in ipairs(dropIds) do
  2079 + local dropData = csvdb["event_dropCsv"][dropId]
  2080 + if dropData then
  2081 + local cur = dropData["range"]:randWeight(true)
  2082 + if cur and cur[1] ~= 0 then
  2083 + if toClick then
  2084 + cCcount = cCcount + 1
  2085 + else
  2086 + local item = changItem and changItem or cur
  2087 + item[2] = math.floor(item[2] * (1 + addMult))
  2088 + drops[#drops + 1] = item
  2089 + end
  2090 + end
  2091 + end
2009 2092 end
2010   - end
  2093 + -- 这些奖励可能会有被动加成
  2094 + self.battle.player:triggerPassive(Passive.BATTLE_WIN, {drops = drops})
2011 2095  
2012   - -- 转换的click走一波
2013   - local blocks = self:getCurMap():getEmptyBlocks(roomId, blockId, cCcount)
2014   - for _i, cblock in ipairs(blocks) do
2015   - cblock:updateEvent({
2016   - etype = AdvEventType.Click,
2017   - id = clickId
2018   - })
2019   - if cblock ~= block then
2020   - self:backBlockChange(cblock.room.roomId, cblock.blockId)
  2096 + -- 自身带的掉落是不会被改变的 也不会被加成
  2097 + if block.event.item and block.event.item[1] ~= 0 then
  2098 + table.insert(drops, 1, block.event.item)
  2099 + end
  2100 +
  2101 + -- 清空当前的格子
  2102 + block:clear()
  2103 +
  2104 + -- 掉落走一波
  2105 + local blocks = self:getCurMap():getEmptyBlocks(roomId, blockId, #drops)
  2106 + for _i, cblock in ipairs(blocks) do
  2107 + cblock:updateEvent({
  2108 + etype = AdvEventType.Drop,
  2109 + item = drops[_i]
  2110 + })
  2111 + if cblock ~= block then
  2112 + self:backBlockChange(cblock.room.roomId, cblock.blockId)
  2113 + end
  2114 + end
  2115 +
  2116 + -- 转换的click走一波
  2117 + local blocks = self:getCurMap():getEmptyBlocks(roomId, blockId, cCcount)
  2118 + for _i, cblock in ipairs(blocks) do
  2119 + cblock:updateEvent({
  2120 + etype = AdvEventType.Click,
  2121 + id = clickId
  2122 + })
  2123 + if cblock ~= block then
  2124 + self:backBlockChange(cblock.room.roomId, cblock.blockId)
  2125 + end
2021 2126 end
2022 2127 end
2023 2128  
... ...
src/adv/AdvBattle.lua
... ... @@ -316,8 +316,19 @@ function Battle:afterRound()
316 316 build:afterRound("buffAfter")
317 317 end
318 318  
  319 + self.player:triggerPassive(Passive.AFTER_ROUND)
  320 +
  321 + self:checkAura()
  322 +
  323 + self:clearRound()
319 324  
  325 + if self.player.isDead then
  326 + self.adv:over(false, nil, -2)
  327 + end
  328 +end
320 329  
  330 +function Battle:clearRound()
  331 + local mapIdx = self.adv:getCurMapIdx()
321 332 self.player:clearRound()
322 333 for _, enemy in ipairs(self.enemys[mapIdx]) do
323 334 enemy:clearRound()
... ... @@ -347,14 +358,6 @@ function Battle:afterRound()
347 358 build:clear()
348 359 end
349 360 end
350   -
351   - self.player:triggerPassive(Passive.AFTER_ROUND)
352   -
353   - self:checkAura()
354   -
355   - if self.player.isDead then
356   - self.adv:over(false, nil, -2)
357   - end
358 361 end
359 362  
360 363  
... ... @@ -363,18 +366,32 @@ function Battle:battleBegin(roomId, blockId, params)
363 366 if not enemy then return end
364 367 local player = params.player
365 368 if not player then return end
  369 + local penemy = params.enemy or {hp = 0}
  370 + if player.hp ~= 0 then
  371 + if penemy.hp <= 0 then
  372 + enemy:kill()
  373 + self.adv.owner:checkTaskEnter("AdvBattleWin", {id = self.adv.chapterId})
  374 + else
  375 + -- 处理一下怪物
  376 + if penemy.hp > enemy.hp then
  377 + enemy:recover(penemy.hp - enemy.hp)
  378 + else
  379 + enemy:hurt(math.max(0, math.ceil(enemy.hp - penemy.hp)), self.player, {hurtType = 5}) --战斗血量只会变少
  380 + end
  381 + if penemy.escape and penemy.escape == 0 then
  382 + enemy.isDead = 1
  383 + end
  384 + end
  385 + end
366 386 -- 玩家没死就是怪死了
367 387 if player.hp > 0 then
368   - enemy:kill()
369 388 self.player:effectBattleBuff()
370   -
371   - self.adv.owner:checkTaskEnter("AdvBattleWin", {id = self.adv.chapterId})
372 389 if params.bySkill then
373 390 self.player:triggerPassive(Passive.SKILL_KILL)
374 391 end
375 392 end
376 393 if player.hp > self.player.hp then
377   - self.player:recover(player.hp - self.player.hp, player)
  394 + self.player:recover(player.hp - self.player.hp)
378 395 else
379 396 self.player:hurt(math.max(0, math.ceil(self.player.hp - player.hp)), enemy, {hurtType = 5}) --战斗血量只会变少
380 397 end
... ... @@ -429,7 +446,7 @@ function Battle:initMapEffect(ilayer)
429 446 end
430 447  
431 448 for _, buff in ipairs(buffs[1] or {}) do
432   - self.palyer:addBuff(buff)
  449 + self.player:addBuff(buff)
433 450 end
434 451  
435 452 for _, buff in ipairs(buffs[2] or {}) do
... ... @@ -446,16 +463,18 @@ function Battle:iLayerChange(oldMapIdx)
446 463 local playerBuffs = self:checkDiffAuraBuff(self:getAurasByMap(oldMapIdx), auras)
447 464 local enemyBuffs = self:checkDiffAuraBuff(self:getAurasByMap(), auras)
448 465 self.player:checkAuraBuff(playerBuffs)
449   - for _, enemy in pairs(self.player:getTeam(2)) do
  466 + for _, enemy in ipairs(self.enemys[self.adv:getCurMapIdx()]) do
450 467 enemy:checkAuraBuff(enemyBuffs)
451 468 end
452 469 self:setMapAuras(auras)
  470 + self:clearRound()
453 471 end
454 472  
455 473 -- 新的 关卡 关闭旧的战斗模块 清理 玩家身上的光环效果
456 474 function Battle:overBattle()
457 475 local buffs = self:checkDiffAuraBuff(self:getAurasByMap(), {})
458 476 self.player:checkAuraBuff(buffs)
  477 + self:clearRound()
459 478 self.adv.owner:getProperty("advTeam").player = self.player:getDB() -- 临时缓存住 battle 的player
460 479 end
461 480  
... ... @@ -463,9 +482,17 @@ end
463 482 function Battle:newBattle()
464 483 local auras = self:getActiveAuras()
465 484 local buffs = self:checkDiffAuraBuff({}, auras)
  485 + self.player:checkAuraBuff(buffs)
  486 + for _, enemy in ipairs(self.enemys[self.adv:getCurMapIdx()]) do
  487 + enemy:checkAuraBuff(buffs)
  488 + end
466 489 self:setMapAuras(auras)
467 490 end
468 491  
  492 +function Battle:loadBattle(info)
  493 + self.auras = info.auras or {}
  494 +end
  495 +
469 496 -- 过了回合 检查光环
470 497 function Battle:checkAura()
471 498 local auras = self:getActiveAuras()
... ...
src/adv/AdvBlock.lua
... ... @@ -332,7 +332,9 @@ end
332 332 function Block:getObstacle()
333 333 if self:isMonster() then
334 334 local enemy = self.room.map.adv.battle:getEnemy(self.room.roomId, self.blockId)
335   - return enemy:getObstacle()
  335 + if enemy then
  336 + return enemy:getObstacle()
  337 + end
336 338 end
337 339 local data = self:getEventData()
338 340 if not data then return 0 end
... ...
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  
... ... @@ -489,6 +489,8 @@ function Buff:createAfter(layer)
489 489 if self._init then
490 490 self:_init()
491 491 end
  492 + self:pushBackEffect(1)
  493 + buglog("Buff", "who: %s create buffId: %s", self.owner.monsterId, self.id)
492 494 end
493 495  
494 496 function Buff:initByDB(data)
... ... @@ -620,11 +622,20 @@ function Buff:canEffect(...)
620 622 return self:_canEffect(...)
621 623 end
622 624  
  625 +function Buff:pushBackEffect(etype)
  626 + local shows = self.buffData.show:toTableArray(true)
  627 + for _, one in ipairs(shows) do
  628 + if one[1] == etype then
  629 + self.owner.battle.adv:pushBackEvent(AdvBackEventType.BuffEffect, {etype = etype, id = self.id, blockId = self.owner.blockId, roomId = self.owner.roomId})
  630 + break
  631 + end
  632 + end
  633 +end
  634 +
623 635 function Buff:effect()
  636 + buglog("Buff", "who: %s effect buffId: %s", self.owner.monsterId, self.id)
624 637 self:decCount()
625   - if self.buffData.show:sismember(2, " ") then
626   - self.owner.battle.adv:pushBackEvent(AdvBackEventType.BuffEffect, {etype = 2})
627   - end
  638 + self:pushBackEffect(2)
628 639 if self._effectValue then
629 640 return self:_effectValue()
630 641 end
... ... @@ -646,6 +657,7 @@ function Buff:endBuff()
646 657 if self._endBuff then
647 658 self:_endBuff()
648 659 end
  660 + buglog("Buff", "who: %s endBuff buffId: %s", self.owner.monsterId, self.id)
649 661 end
650 662  
651 663 function Buff:getType()
... ... @@ -698,6 +710,9 @@ function Buff:overlay(releaser, data, layer)
698 710 if self._overlay then
699 711 self:_overlay()
700 712 end
  713 +
  714 + self:pushBackEffect(1)
  715 + buglog("Buff", "who: %s overlay buffId: %s", self.owner.monsterId, self.id)
701 716 end
702 717 end
703 718  
... ...
src/adv/AdvMap.lua
... ... @@ -13,12 +13,12 @@ local createMap, getEventLib
13 13 function Map:ctor(adv, mapIdx, mapInfo, isEnter, isNewRelay)
14 14 self.adv = adv
15 15 local isNew = type(mapInfo) == "number"
  16 + self.mapIdx = mapIdx
16 17 if isNew then -- mapInfo 传入 id
17 18 mapInfo = createMap(self, mapInfo, isEnter, isNewRelay) -- 生成地图
18 19 end
19 20 if not mapInfo then return end
20 21  
21   - self.mapIdx = mapIdx
22 22 self.mapId = mapInfo.mapId
23 23 self.isShow = mapInfo.isShow -- 是否全部展示 -- 客户端用
24 24 self.rooms = {}
... ... @@ -258,7 +258,7 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack)
258 258 if isPlayer then
259 259 self.adv.battle:triggerPassive(Passive.OPEN_BLOCK, {roomId = roomId, blockId = blockId})
260 260 self.adv.owner:checkTaskEnter("AdvOpenBlock")
261   -
  261 + self.adv.battle.player:changeSp(1) -- 翻开格子 sp 加1
262 262 -- 潜行检查
263 263 local sneakBuff = self.adv.battle.player:hadBuff(Buff.SNEAK)
264 264 if sneakBuff then
... ... @@ -313,13 +313,13 @@ function Map:openBlocksIsMonsterByRoom(roomId, count, isPlayer, ignoreBack)
313 313 end
314 314 end
315 315  
316   - if not count or count == -1 or count >= len(allBlock) then
  316 + if not count or count == -1 or count >= #allBlock then
317 317 for _, blockId in ipairs(allBlock) do
318 318 openBlock(blockId)
319 319 end
320 320 else
321 321 for i = 1, count do
322   - local idx = math.randomInt(1, len(allBlock))
  322 + local idx = math.randomInt(1, #allBlock)
323 323 openBlock(allBlock[idx])
324 324 table.remove(allBlock, idx)
325 325 end
... ... @@ -349,8 +349,8 @@ function Map:getDistance(froomId, fblockId, troomId, tblockId)
349 349 local room1 = self.rooms[froomId]
350 350 local room2 = self.rooms[troomId]
351 351 if room1 and room2 then
352   - local block1 = room1[fblockId]
353   - local block2 = room2[tblockId]
  352 + local block1 = room1.blocks[fblockId]
  353 + local block2 = room2.blocks[tblockId]
354 354 if block1 and block2 then
355 355 local c1, r1 = room1:tranLtoG(block1.col, block1.row)
356 356 local c2, r2 = room2:tranLtoG(block2.col, block2.row)
... ... @@ -811,6 +811,48 @@ createMap = function(self, mapId, isEnter, isNewRelay)
811 811 end
812 812 end
813 813 end
  814 + -- 宝藏怪刷新
  815 + if self.mapIdx == 1 and not self.adv.isRelay and self.adv.chapterId ~= 100 then
  816 + for idx = #(stagePool["global"][AdvCodeRandomStage] or {}), 1, -1 do
  817 + local c = stagePool["global"][AdvCodeRandomStage][idx] -- {room = roomId, block = blockId}
  818 + if mapInfo.rooms[c["room"]]["event"][c["block"]] then -- 存在
  819 + table.remove(stagePool["global"][AdvCodeRandomStage], idx)
  820 + end
  821 + end
  822 + local ln = #(stagePool["global"][AdvCodeRandomStage] or {})
  823 + local advMine = self.adv.owner:getProperty("advMine")
  824 + advMine[1] = advMine[1] or {}
  825 + local mineCh = advMine[1].ch or globalCsv.adv_egg_treasureMonster_showup
  826 + local mineCo = advMine[1].co or {}
  827 + local had = false
  828 + if ln > 0 then
  829 + if math.randomInt(1, 100) <= mineCh then -- 刷出来了
  830 + local mpool = {}
  831 + for _, mid in ipairs(globalCsv.adv_egg_treasureMonster_id) do
  832 + local monster = csvdb["event_monsterCsv"][mid]
  833 + if (not mineCo[mid] or monster.limit == 0 or mineCo[mid] < monster.limit) and monster.showup > 0 then
  834 + mpool[mid] = {monster.showup}
  835 + end
  836 + end
  837 + if next(mpool) then
  838 + local idx = math.randomInt(1, ln)
  839 + local cur = stagePool["global"][AdvCodeRandomStage][idx]
  840 + giveEvent(cur["room"], cur["block"], AdvEventType.Monster, math.randWeight(mpool, 1))
  841 + table.remove(stagePool["global"][AdvCodeRandomStage], idx)
  842 + ln = ln - 1
  843 + had = true
  844 + end
  845 + end
  846 + end
  847 + if had then
  848 + mineCh = nil
  849 + else
  850 + mineCh = math.min(mineCh + globalCsv.adv_egg_treasureMonster_showup_add, 100)
  851 + end
  852 + advMine[1].ch = mineCh
  853 + self.adv.owner:setProperty("advMine", advMine)
  854 + end
  855 +
814 856  
815 857 if mapCsvData.clearType == 1 and not haveBoss then
816 858 if not next(monsterEvents) then
... ...
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,23 +48,27 @@ 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   - if self.owner.blockId and self.owner.roomId and params.blockId and params.roomId then
  53 + if params and self.owner.blockId and self.owner.roomId and params.blockId and params.roomId then
54 54 local distance = self.owner.battle.adv:getCurMap():getDistance(self.owner.roomId, self.owner.blockId, params.roomId, params.blockId)
55 55 return distance ~= -1 and distance <= self.value
56 56 end
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  
... ... @@ -95,9 +103,8 @@ function Filter:execute(params)
95 103 if not target then
96 104 return
97 105 end
98   - if self:_execute(target) then
99   - return self:_execute(target, params)
100   - end
  106 +
  107 + return self:_execute(target, params)
101 108 end
102 109  
103 110 -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
... ... @@ -203,7 +210,7 @@ PassiveCondFactory[Passive.PLAYER_BUFF] = PassiveCondFactory[Passive.GET_BUFF]
203 210  
204 211 PassiveCondFactory[Passive.PLAYER_BUFF_CLASSIFY] = function(_Passive)
205 212 _Passive._trigger = function(self, params)
206   - if params.classify:sismember(self.passiveData.value) then
  213 + if params.classify:sismember(self.passiveData.value, " ") then
207 214 return true
208 215 end
209 216 end
... ... @@ -340,6 +347,7 @@ function Passive:canEffect(effType, effValue)
340 347 end
341 348  
342 349 function Passive:effect(triggerPms)
  350 + local hadEffect = false
343 351 for _, effect in ipairs(self.effects) do
344 352 local effType = effect[1]
345 353 local effValue = effect[2]
... ... @@ -348,10 +356,14 @@ function Passive:effect(triggerPms)
348 356 table.insert(otherPms, effect[i])
349 357 end
350 358 if self:canEffect(effType, effValue) then
  359 + hadEffect = true
351 360 self["effect" .. effType](self, effValue, triggerPms, table.unpack(otherPms))
352 361 end
353 362 end
354   -
  363 + if hadEffect then
  364 + self.owner.battle.adv:pushBackEvent(AdvBackEventType.PassiveEffect, {id = self.id, level = self.level, roomId = self.owner.roomId, blockId = self.owner.blockId})
  365 + buglog("Passive", "who: %s effect id: %s", self.owner.monsterId, self.id)
  366 + end
355 367 if self.count > 0 then
356 368 self.count = self.count < 999 and self.count - 1 or self.count
357 369 self.round = self.passiveData.round
... ... @@ -401,6 +413,8 @@ function Passive:trigger(condType, params) --触发检查
401 413 params = params or {}
402 414 if self.isDel or self.owner.isDead then return end
403 415 if self:getCondType() ~= condType then return end
  416 +
  417 + buglog("Passive", "who: %s trigger id: %s", self.owner.monsterId, self.id)
404 418 if not self:canTrigger() then return end
405 419 if self._trigger then
406 420 if not self:_trigger(params) then return end --检查
... ... @@ -597,5 +611,9 @@ function Passive:effect16(value, triggerPms, changeType)
597 611 self.owner.battle.adv:blockDropChange(changeType, blocks)
598 612 end
599 613  
  614 +--17=玩家获得buff
  615 +function Passive:effect17(value, triggerPms)
  616 + self.owner.battle.player:addBuff(value, self.owner)
  617 +end
600 618  
601 619 return Passive
602 620 \ No newline at end of file
... ...
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
... ... @@ -699,7 +699,7 @@ function Enemy:checkAuraBuff(buffs)
699 699 if buff then
700 700 buff:uncover(info.exist and -info.count or -1, true)
701 701 end
702   - elseif count > 0 then
  702 + elseif info.count > 0 then
703 703 self:addBuff(buffId, nil, info.count)
704 704 end
705 705 end
... ... @@ -847,10 +847,6 @@ function Player:addBuff(buffId, releaser)
847 847 self.battle.adv:checkAchievement(self.battle.adv.AchievType.GetBuff, 1, buffId)
848 848 self.battle.adv:pushBackEvent(AdvBackEventType.Buff, {buffId = buffId})
849 849 self.battle:triggerPassive(Passive.PLAYER_BUFF, {buffId = buffId})
850   - local buffData = csvdb["adv_map_buffCsv"][buffId]
851   - if buffData and buffData.show:sismember(1, " ") then
852   - self.battle.adv:pushBackEvent(AdvBackEventType.BuffEffect, {etype = 1})
853   - end
854 850 end
855 851 return status
856 852 end
... ...
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}
... ... @@ -356,11 +357,6 @@ skynet.start(function()
356 357 return info
357 358 end)
358 359  
359   - redisd = skynet.localname(".redis")
360   - if tonumber(skynet.getenv "logd") == 1 then
361   - logd = skynet.localname(".log")
362   - end
363   -
364 360 cs = queue()
365 361  
366 362 pvpd = skynet.localname(".pvpcross")
... ...
1   -Subproject commit a2598231ccc5e16da1a27f976602871f30fcd035
  1 +Subproject commit 5963ca5e80ac32e27cadf4c2553f1f24af8d9435
... ...
src/main.lua
... ... @@ -2,23 +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  
  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 +
10 32 local httpd = skynet.newservice("services/httpweb", tonumber(skynet.getenv("httpweb_port")))
11 33 local watchdog = skynet.newservice("services/watchdog", max_client)
12 34  
  35 +
13 36 skynet.call(watchdog, "lua", "start", {
14 37 port = tonumber(skynet.getenv("server_port")),
15 38 maxclient = max_client + max_queue + 10,
16 39 httpd = httpd,
17   -
18   - redishost = skynet.getenv("redis_host"),
19   - redisport = tonumber(skynet.getenv("redis_port")),
20   - redisdb = tonumber(skynet.getenv("redis_db")),
21   - auth = skynet.getenv("redis_auth"),
22 40 })
23 41  
24 42 skynet.exit()
... ...
src/models/Activity.lua
... ... @@ -19,8 +19,18 @@ Activity.ActivityType = {
19 19 AdvDraw = 13, --拾荒抽周 资助
20 20 OpenBox = 14, --拆解周 时钟箱
21 21 RaceDraw = 16, -- 定向招募活动
22   -}
23 22  
  23 + ChallengeLevel = 17, -- 挑战关卡活动
  24 + Exchange = 18, -- 兑换活动
  25 + HangDrop = 19, -- 挂机掉落活动
  26 + Gachakon = 20, -- 扭蛋活动
  27 +
  28 + WishHeroPool = 23, -- 心愿卡池
  29 + ActHeroPool = 24, -- 活动卡池
  30 + ActShopGoods = 25, -- 活动商品
  31 +
  32 + Crisis = 26, -- 宝藏怪活动
  33 +}
24 34  
25 35 local function checkActivityType(activityType)
26 36 if type(activityType) == "string" then
... ... @@ -36,18 +46,33 @@ function Activity:ctor(properties)
36 46 self._isOpen = {}
37 47 end
38 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 +
39 56  
40 57 Activity.schema = {
41 58 actime = {"table", {}}, -- 最近检查某项活动的开始时间 {id = time}
42 59 round = {"table", {}}, -- 记录活动到了第几轮 {id = roundnum}
43 60 act4 = {"table", {}}, -- {0 = day, 1= -1, 2 = -1} == 签到活动
44   - act6 = {"table", {}}, -- {1 = 1, 2 = 1} == 付费签到活动
  61 + act6 = {"table", {}}, -- {0 = day, 1 = 1, 2 = 1} == 付费签到活动
45 62 act8 = {"number", 0}, -- 充值返利
46 63  
47 64 act11 = {"table", {}}, -- {0 = 贩卖数量, 1=1, 2=1} 贩卖周活动 1表示领取过该档位的奖励
48 65 act12 = {"table", {}}, -- {0 = 抽卡次数, 1=1, 2=1} 抽卡周活动 1表示领取过该档位的奖励
49 66 act13 = {"table", {}}, -- {0 = 拾荒消耗远古金币数量, 1=1, 2=1} 拾荒周活动 1表示领取过该档位的奖励
50 67 act14 = {"table", {}}, -- {0 = 拆解数量, 1=1, 2=1} 拆解周活动 1表示领取过该档位的奖励
  68 +
  69 + act17 = {"table", {}}, -- {id=关卡星数, totalDmg=Boss总伤害}
  70 + act18 = {"table", {}, true}, -- {id=兑换数量}
  71 + act19 = {"number", 0}, -- {挂机信息}
  72 + act20 = {"table", {}}, -- {id=扭蛋抽出数量}
  73 +
  74 + act24 = {"table", {}, true}, -- 活动卡池 {id=repaynum}
  75 + act26 = {"table", {}}, -- {task = {id = count}, socre = {id = status}}
51 76 }
52 77  
53 78 function Activity:data()
... ... @@ -61,6 +86,12 @@ function Activity:data()
61 86 act12 = self:getProperty("act12"),
62 87 act13 = self:getProperty("act13"),
63 88 act14 = self:getProperty("act14"),
  89 +
  90 + act17 = self:getProperty("act17"),
  91 + act18 = self:getProperty("act18"),
  92 + act19 = self:getProperty("act19"),
  93 + act20 = self:getProperty("act20"),
  94 + act26 = self:getProperty("act26"),
64 95 }
65 96 end
66 97  
... ... @@ -138,6 +169,15 @@ function Activity:isOpen(activityType)
138 169 return false
139 170 end
140 171  
  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 +
  178 + return self._isOpen[id]
  179 +end
  180 +
141 181 function Activity:getActData(actType)
142 182 actType = checkActivityType(actType)
143 183 return self:getProperty("act" .. actType)
... ... @@ -160,6 +200,7 @@ function Activity:checkActivityStatus(now, isCrossDay, notify)
160 200  
161 201 if isOpen then
162 202 if actime[actId] and actime[actId] == startTime then -- 还是之前的状态 开放中
  203 + self:onLoginActivity(actId)
163 204 else -- 重置
164 205 actime[actId] = startTime
165 206 self:closeActivity(actId, notify, true)
... ... @@ -236,38 +277,56 @@ function Activity:checkWeeklyAct(actType, notify, count, pool)
236 277 local totalCnt = 0
237 278 local finishCnt = 0
238 279 local maxCondition = 0
239   - for k, cfg in pairs(csvdb[info.table] or {}) do
240   - totalCnt = totalCnt + 1
241   - if maxCondition < cfg.condition1 then
242   - maxCondition = cfg.condition1
243   - end
244   - if not curData[cfg.id] and curData[0] >= cfg.condition1 then
245   - if info.mailId then
  280 + local flag = true
  281 + while flag do
  282 + --print("tatal number :", curData[0])
  283 + for i = 1, #csvdb[info.table] do
  284 + local cfg = csvdb[info.table][i]
  285 + --for k, cfg in pairs(csvdb[info.table] or {}) do
  286 + totalCnt = totalCnt + 1
  287 + if maxCondition < cfg.condition1 then
  288 + maxCondition = cfg.condition1
  289 + end
  290 + --print("cur condition", cfg.condition1)
  291 + if curData[0] < cfg.condition1 then
  292 + flag = false
  293 + break
  294 + end
  295 +
  296 + --print(curData[0], cfg.condition1)
  297 + if not curData[cfg.id] and curData[0] >= cfg.condition1 then
  298 + if info.mailId then
246 299  
247   - self.owner:log("activity", {
248   - activity_id = cfg.id, -- 活动ID(或活动指定任务的ID)
249   - activity_type = actType, -- 活动类型,见活动类型枚举表
250   - activity_reward = cfg.reward:toNumMap(), -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
251   - })
  300 + self.owner:log("activity", {
  301 + activity_id = cfg.id, -- 活动ID(或活动指定任务的ID)
  302 + activity_type = actType, -- 活动类型,见活动类型枚举表
  303 + activity_reward = cfg.reward:toNumMap(), -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...}
  304 + })
252 305  
253   - self.owner:sendMail(info.mailId, nil, cfg.reward, {cfg.condition1})
254   - curData[cfg.id] = 1
  306 + self.owner:sendMail(info.mailId, nil, cfg.reward, {cfg.condition1})
  307 + curData[cfg.id] = 1
  308 + end
  309 + end
  310 + if curData[cfg.id] then
  311 + finishCnt = finishCnt + 1
255 312 end
256 313 end
257   - if curData[cfg.id] then
258   - finishCnt = finishCnt + 1
259   - end
260   - end
261   - if totalCnt == finishCnt then
262   - roundData[actType] = curRound + 1
263   - for k,v in pairs(curData) do
264   - if k == 0 then
265   - curData[k] = curData[0] >= maxCondition and curData[0] - maxCondition or 0
266   - else
267   - curData[k] = nil
  314 + if totalCnt == finishCnt then
  315 + roundData[actType] = (roundData[actType] or 0) + 1
  316 + for k,v in pairs(curData) do
  317 + if k == 0 then
  318 + curData[k] = curData[0] >= maxCondition and curData[0] - maxCondition or 0
  319 + else
  320 + curData[k] = nil
  321 + end
  322 + end
  323 + --print("cur round ".. roundData[actType], ctrlData.condition)
  324 + if roundData[actType] >= ctrlData.condition then
  325 + curData[0] = maxCondition
  326 + flag = false
268 327 end
  328 + self:updateProperty({field = "round", value = roundData, notNotify = not notify})
269 329 end
270   - self:updateProperty({field = "round", value = roundData, notNotify = not notify})
271 330 end
272 331 self:updateActData(actType, curData, not notify)
273 332 end
... ... @@ -345,6 +404,11 @@ activityFunc[Activity.ActivityType.PaySignIn] = {
345 404 ["init"] = function(self, actType, isCrossDay, notify)
346 405 self:updateActData(actType, {}, not notify)
347 406 end,
  407 + ["crossDay"] = function(self, actType, notify)
  408 + local curData = self:getActData(actType)
  409 + curData[0] = (curData[0] or 0) + 1
  410 + self:updateActData(actType, curData, not notify)
  411 + end,
348 412 ["close"] = function(self, actType, notify)
349 413 self.owner.storeData:SetActGoodsFlag("paySignIn", 0)
350 414  
... ... @@ -400,7 +464,8 @@ activityFunc[Activity.ActivityType.CalendaTask] = {
400 464 local towerInfo = role:getProperty("towerInfo")
401 465 role:checkTaskEnter("TowerPass", {level = towerInfo.l})
402 466 --"PvpWin"
403   - role:checkTaskEnter("HangPass", {})
  467 + --role:checkTaskEnter("HangPass", {id = 0})
  468 + role:checkCalendaTask(true, 15, 3)
404 469 role:checkTaskEnter("HeroStarCollect", {})
405 470 role:checkTaskEnter("RuneQualityCollect", {})
406 471  
... ... @@ -409,12 +474,101 @@ activityFunc[Activity.ActivityType.CalendaTask] = {
409 474 -- end,
410 475 }
411 476  
  477 +-- 兑换
  478 +activityFunc[Activity.ActivityType.Exchange] = {
  479 + ["init"] = function(self, actType, isCrossDay, notify, actId)
  480 + local actData = self:getActData(actType) or {}
  481 + actData[actId] = {}
  482 + self:updateActData(actType, actData, not notify)
  483 + end,
  484 + ["crossDay"] = function(self, actType, notify, actId)
  485 + local actData = self:getActData(actType) or {}
  486 + local lastTs = actData["ts"] or 0
  487 + local timeNow = skynet.timex()
  488 + local cfg = csvdb["activity_ctrlCsv"][actId]
  489 + if not cfg then return end
  490 + local refreshTimes = cfg.condition2:toArray(false, "=")
  491 + for i = 1, #refreshTimes do
  492 + local rt = toUnixtime(refreshTimes[1]..string_format("%02x", RESET_TIME))
  493 + if timeNow >= rt and rt > lastTs then
  494 + lastTs = rt
  495 + actData = {}
  496 + end
  497 + end
  498 + if next(actData) then
  499 + actData["ts"] = lastTs
  500 + self:updateActData(actType, actData, not notify)
  501 + end
  502 + end,
  503 + ["close"] = function(self, actType, notify, actId)
  504 + local actData = self:getActData(actType) or {}
  505 + actData[actId] = nil
  506 + self:updateActData(actType, actData, not notify)
  507 + end,
  508 +}
  509 +
  510 +-- 扭蛋机
  511 +activityFunc[Activity.ActivityType.Gachakon] = {
  512 + ["init"] = function(self, actType, isCrossDay, notify, actId)
  513 + self:updateActData(actType, {}, not notify)
  514 + end,
  515 + ["crossDay"] = function(self, actType, notify)
  516 + self:updateActData(actType, {}, not notify)
  517 + end,
  518 +}
  519 +
  520 +-- 活动卡池
  521 +activityFunc[Activity.ActivityType.ActHeroPool] = {
  522 + ["init"] = function(self, actType, isCrossDay, notify, actId)
  523 + end,
  524 + ["close"] = function(self, actType, notify, actId)
  525 + local actData = self:getActData(actType)
  526 + local cfg = csvdb["activity_ctrlCsv"][actId]
  527 + if not cfg then return end
  528 + actData[cfg.condition] = nil
  529 + self:updateActData(actType, actData, not notify)
  530 + end,
  531 +}
  532 +
  533 +-- 挂机掉落
  534 +activityFunc[Activity.ActivityType.HangDrop] = {
  535 + ["init"] = function(self, actType, isCrossDay, notify, actId)
  536 + local actime = self:getProperty("actime")
  537 + local ctime = self.owner:getProperty("ctime")
  538 + local startTime = math.max(actime[actId], ctime)
  539 + local actData = self:getActData(actType) or 0
  540 + local cfg = csvdb["activity_putCsv"][actId]
  541 + if not cfg then return end
  542 + actData = startTime
  543 + self:updateActData(actType, actData, not notify)
  544 + end
  545 +}
  546 +
  547 +--ChallengeLevel
  548 +activityFunc[Activity.ActivityType.ChallengeLevel] = {
  549 + ["init"] = function(self, actType, isCrossDay, notify, actId)
  550 + self:getBattleTicket(actId)
  551 + end,
  552 + ["login"] = function(self, actType, actId)
  553 + self:getBattleTicket(actId)
  554 + end
  555 +}
  556 +
  557 +function Activity:onLoginActivity(actId)
  558 + local actData = csvdb["activity_ctrlCsv"][actId]
  559 + if not actData then return end
  560 + local actType = actData.showType
  561 + if activityFunc[actType] and activityFunc[actType]['login'] then
  562 + activityFunc[actType]["login"](self, actType, actId)
  563 + end
  564 +end
  565 +
412 566 function Activity:initActivity(actId, isCrossDay, notify)
413 567 local actData = csvdb["activity_ctrlCsv"][actId]
414 568 if not actData then return end
415 569 local actType = actData.showType
416   - if activityFunc[actType] and activityFunc[actType]['close'] then
417   - activityFunc[actType]["init"](self, actType, isCrossDay, notify)
  570 + if activityFunc[actType] and activityFunc[actType]['init'] then
  571 + activityFunc[actType]["init"](self, actType, isCrossDay, notify, actId)
418 572 end
419 573 end
420 574  
... ... @@ -423,10 +577,13 @@ function Activity:closeActivity(actId, notify, notUpdateAct)
423 577 if not actData then return end
424 578 local actType = actData.showType
425 579 if activityFunc[actType] and activityFunc[actType]['close'] then
426   - activityFunc[actType]["close"](self, actType, notify)
  580 + activityFunc[actType]["close"](self, actType, notify, actId)
  581 + self:recycleActItem(actId)
427 582 end
428 583 if Activity.schema["act".. actType] then
429   - self:updateActData(actType, Activity.schema["act" .. actType][2], not notify or notUpdateAct)
  584 + if not Activity.schema["act" .. actType][3] then
  585 + self:updateActData(actType, Activity.schema["act" .. actType][2], not notify or notUpdateAct)
  586 + end
430 587 end
431 588 end
432 589  
... ... @@ -436,7 +593,7 @@ function Activity:refreshDailyData(notify)
436 593 if status and actData then
437 594 local actType = actData.showType
438 595 if activityFunc[actType] and activityFunc[actType]['crossDay'] then
439   - activityFunc[actType]["crossDay"](self, actType, notify)
  596 + activityFunc[actType]["crossDay"](self, actType, notify, actId)
440 597 end
441 598 end
442 599 end
... ... @@ -453,8 +610,8 @@ end
453 610 -- 获取此次挂机掉落翻倍时长
454 611 function Activity:getActHangDoubleTime(lastTs, nowTs)
455 612 local type = "DoubleDrop"
456   - local actId = checkActivityType(type)
457   - local isOpen = self:isOpen(type)
  613 + --local actId = checkActivityType(type)
  614 + local isOpen, actId = self:isOpen(type)
458 615 local openTs = self:getProperty("actime")[actId] or 0
459 616 local timeNow = skynet.timex()
460 617 lastTs = math.max(lastTs, openTs)
... ... @@ -529,5 +686,122 @@ function Activity:getPaySignReward()
529 686 --SendPacket(actionCodes.Activity_actPaySignRpc, MsgPack.pack(role:packReward(reward, change)))
530 687 end
531 688  
  689 +-- 回收活动道具
  690 +function Activity:recycleActItem(actId)
  691 + local role = self.owner
  692 + local actCfg = csvdb["activity_ctrlCsv"][actId]
  693 + if not actCfg then return end
  694 + local gift = {}
  695 + local costs = {}
  696 + for _, arr in ipairs(actCfg.recycle:toTableArray(true)) do
  697 + local fromId, toId, toNum = arr[1], arr[2], arr[3]
  698 + local itemCount = role:getItemCount(fromId)
  699 + if itemCount > 0 then
  700 + costs[fromId] = (costs[fromId] or 0) + itemCount
  701 + gift[toId] = toNum * itemCount
  702 + end
  703 + end
  704 + if next(costs) then
  705 + local itemStr = ""
  706 + for k, v in pairs(costs) do
  707 + if itemStr ~= "" then
  708 + itemStr = itemStr .. " "
  709 + end
  710 + itemStr = itemStr .. k .. "=" .. v
  711 + end
  712 + role:costItems(costs, {log = {desc = "actRecycle"}})
  713 + role:sendMail(actCfg.recycle_email, nil, gift, {itemStr})
  714 + end
  715 +end
  716 +
  717 +-- 活动挑战关卡计算门票
  718 +function Activity:getBattleTicket(actId)
  719 + local role = self.owner
  720 + local createTs = role:getProperty("ctime")
  721 + local actCfg = csvdb["activity_ctrlCsv"][actId]
  722 + if not actCfg then return 0 end
  723 +
  724 + local actStartTime = 0
  725 + local openTimes = actCfg.time:toArray(false, "=")
  726 + actStartTime = toUnixtime(openTimes[1]..string_format("%02x", RESET_TIME))
  727 + local actData = self:getActData("ChallengeLevel") or {}
  728 + local startTs = actData["ts"] or math.max(actStartTime, createTs)
  729 + local timeNow = skynet.timex()
  730 + local modify = false
  731 + local arr = actCfg.condition2:toArray(true, "=")
  732 +
  733 + local ticketId, init, limit, duration = arr[1] or 0, arr[2] or 0, arr[3] or 0, arr[4] or 10000
  734 +
  735 + local count = actData["ticket"] or init
  736 + local add = math.max(math.floor((timeNow - startTs) / (duration * 60)), 0)
  737 +
  738 + local newCount= math.min(count + add, limit)
  739 + if newCount ~= count or newCount >= limit then
  740 + modify = true
  741 + end
  742 + add = newCount - count
  743 +
  744 + if modify or not next(actData) then
  745 + actData["ticket"] = newCount
  746 + actData["ts"] = newCount >= limit and timeNow or (startTs + add * duration * 60)
  747 + self:updateActData("ChallengeLevel", actData)
  748 + end
  749 +end
  750 +
  751 +activityFunc[Activity.ActivityType.ActShopGoods] = {
  752 + ["init"] = function(self, actType, isCrossDay, notify, actId)
  753 + end,
  754 + ["close"] = function(self, actType, notify)
  755 + local rechargeRecord = self.owner.storeData:getProperty("payR")
  756 + for id, cfg in pairs(csvdb["shop_rechargeCsv"]) do
  757 + if cfg.shop == 3 and cfg.type == ShopPackType.ActShopPack then
  758 + rechargeRecord[id] = nil
  759 + end
  760 + end
  761 + self.owner.storeData:updateProperty({field="payR", value=rechargeRecord})
  762 + end,
  763 +}
  764 +
  765 +
  766 +
  767 +activityFunc[Activity.ActivityType.Crisis] = {
  768 + ["check"] = function(self, actType, notify, atype, count) -- 检查
  769 + count = count or 1
  770 + local isOpen, actId = self:isOpen(actType)
  771 + local actData = self:getActData(actType) or {}
  772 + actData.task = actData.task or {}
  773 + local change = false
  774 + local actCsv = csvdb["activity_crisisCsv"][actId]
  775 + for id, actSet in pairs(actCsv) do
  776 + if actSet.type == atype then
  777 + local status = actData.task[id] or 0
  778 + status = status + count
  779 + if status >= actSet.condition1 then
  780 + local reward
  781 + if actSet.loop == 1 then
  782 + local rcount = math.floor(status / actSet.condition1)
  783 + reward = actSet.reward:toNumMap()
  784 + for itemId, itemC in pairs(reward) do
  785 + reward[itemId] = itemC * rcount
  786 + end
  787 + status = status % actSet.condition1
  788 + else
  789 + reward = actSet.reward
  790 + status = -1
  791 + end
  792 +
  793 + self.owner:award(reward, {log = {desc = "activity_crisis"}, notNotify = not notify})
  794 + end
  795 + actData.task[id] = status
  796 + change = true
  797 + end
  798 + end
  799 + if change then
  800 + -- 更新下排行榜
  801 + self.owner:updateRankCommon(RANK_TYPE.ActCrisis, self.owner:getItemCount(ItemId.CrisisScore))
  802 + self:updateActData(actType, actData)
  803 + end
  804 + end,
  805 +}
532 806  
533 807 return Activity
... ...
src/models/Email.lua
... ... @@ -48,10 +48,10 @@ function Email:data()
48 48  
49 49 if emailData then
50 50 -- 如果内容是直接插入到数据库
51   - if content == "" and emailData.body ~= "" then
52   - content = io.readfile("src/" .. emailData.body) or ""
53   - content = content:format(table.unpack(contentPms))
54   - end
  51 + --if content == "" and emailData.body ~= "" then
  52 + -- content = io.readfile("src/" .. emailData.body) or ""
  53 + -- content = content:format(table.unpack(contentPms))
  54 + --end
55 55  
56 56 if title == "" and emailData.title ~= "" then
57 57 title = emailData.title
... ... @@ -62,17 +62,23 @@ 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  
69 73 return {
  74 + cfgId = emailId,
70 75 id = self:getProperty("id"),
71 76 status = self:getProperty("status"),
72 77 createtime = self:getProperty("createtime"),
73 78 title = title,
74 79 stitle = stitle,
75 80 content = content,
  81 + contentPms = contentPms,
76 82 attachments = attachments,
77 83 }
78 84 end
... ...
src/models/HeroPlugin.lua
... ... @@ -126,11 +126,11 @@ function HeroPlugin.bind(Hero)
126 126 end
127 127  
128 128 -- 羁绊加成
129   - if params.activeRelation then
130   - for k, attName in pairs(AttsEnumEx) do
131   - attrs[attName] = attrs[attName] + addAttr(attrs[attName], params.activeRelation[attName], 1, attName)
132   - end
133   - end
  129 + -- if params.activeRelation then
  130 + -- for k, attName in pairs(AttsEnumEx) do
  131 + -- attrs[attName] = attrs[attName] + addAttr(attrs[attName], params.activeRelation[attName], 1, attName)
  132 + -- end
  133 + -- end
134 134 return attrs
135 135 end
136 136  
... ... @@ -224,8 +224,10 @@ function HeroPlugin.bind(Hero)
224 224  
225 225  
226 226 -- 战斗力(当前属性)= POWER[(生命 + 防御 * 7 + 闪避 * 4)*(攻击*4 + 命中 * 2)*(1 + 暴击几率/100 * 暴击伤害/100)* 攻击速度 / 60000 ,0.8 ]
227   - function Hero:getBattleValue(activeRelation) -- isReal包括队伍加成
228   - local attrs = self:getTotalAttrs({activeRelation = activeRelation})
  227 + -- function Hero:getBattleValue(activeRelation) -- isReal包括队伍加成
  228 + function Hero:getBattleValue() -- isReal包括队伍加成
  229 + -- local attrs = self:getTotalAttrs({activeRelation = activeRelation})
  230 + local attrs = self:getTotalAttrs()
229 231 local battleValue = ((attrs["hp"] + attrs["def"] * 7 + attrs["miss"] * 4) * (attrs["atk"] * 4 + attrs["hit"] * 2) * (1 + attrs["crit"]/100 * attrs["critHurt"]/100) * attrs["atkSpeed"] / 600000) ^ 0.8
230 232 return math.floor(battleValue)
231 233 end
... ...
src/models/Role.lua
... ... @@ -99,7 +99,8 @@ Role.schema = {
99 99 advLimit = {"table", {}}, -- 冒险事件每次的limit
100 100 advC = {"number", 0}, -- 冒险次数(消耗体力)
101 101 advCT = {"number", 0}, -- 冒险次数 上次恢复时间
102   -
  102 + advMine = {"table", {}}, -- -- {1 = {ch = 0, co = {id = count}}, 2 = {ch = 0, co = {id = count}}} 宝藏怪刷出概率 1 宝藏怪 2 宝藏洞 ch 概率 co 不同id 次数记录
  103 +
103 104 --挂机相关
104 105 hangPass = {"table", {}}, -- 挂机通过的最大关卡
105 106 hangGift = {"table", {}}, -- 挂机奖励 {id = 1}
... ... @@ -167,7 +168,8 @@ Role.schema = {
167 168 repayMaxC = {"number", 0}, -- 招募保底英雄领取次数 100一次
168 169 floorHero = {"table", {}}, -- 招募保底 -- {[poolId] = count}
169 170 ssrUp = {"table", {}}, -- ssr up -- {[poolId] = count}
170   - newerDraw = {"table", {}}, -- 新手池子 {N, 1} 抽了多少次, 是否出了ssr
  171 + newerDraw = {"number", 0}, -- 新手池子抽卡次数
  172 + wishPool = {"table", {}}, -- 心愿池子
171 173  
172 174 sudoku = {"table", {}}, -- 九宫格 {[-1] = 1, task = {[1] = {}, [2] = {}}}} -- [-1] 阶段 如果为 -1 关闭(都做完了), task 当前阶段任务进度, reward 连串奖励领取情况
173 175 sign = {"table", {}}, -- 签到记录 {[1] = 20181029}
... ... @@ -394,6 +396,7 @@ function Role:data()
394 396 repayHero = self:getProperty("repayHero"),
395 397 newerDraw = self:getProperty("newerDraw"),
396 398 floorHero = self:getProperty("floorHero"),
  399 + wishPool = self:getProperty("wishPool"),
397 400  
398 401 sudoku = self:getProperty("sudoku"),
399 402 sign = self:getProperty("sign"),
... ...
src/models/RoleBattle.lua
... ... @@ -16,6 +16,7 @@ local BattleType = {
16 16 bonus = 300,
17 17 pvpc = 500,
18 18 pvph = 501,
  19 + act_battle = 502,
19 20 }
20 21  
21 22 RoleBattle.bind = function (Role)
... ... @@ -43,7 +44,7 @@ function Role:checkBattle(battleType, params)
43 44  
44 45 local fixData = {
45 46 hang = function()
46   - for slot, hero in pairs(self:getProperty("hangTS")) do
  47 + for slot, hero in pairs(self:getProperty("hangTS").heros) do
47 48 selflist[slot] = hero.type
48 49 end
49 50 heroscore = self:getProperty("hangTBV")
... ... @@ -58,7 +59,7 @@ function Role:checkBattle(battleType, params)
58 59 end,
59 60 tower = function()
60 61 local towerF = self:getTeamFormatByType(TeamSystemType.Tower)
61   - for slot, hero in pairs(self:getTeamHerosInfo(towerF.heros)) do
  62 + for slot, hero in pairs(self:getTeamHerosInfo(towerF).heros) do
62 63 selflist[slot] = hero.type
63 64 end
64 65 heroscore = self:getTeamBattleValue(towerF.heros)
... ... @@ -73,7 +74,7 @@ function Role:checkBattle(battleType, params)
73 74 end,
74 75 bonus = function()
75 76 local bTeam = self:getTeamFormatByType(TeamSystemType.BonusBattle)
76   - for slot, hero in pairs(self:getTeamHerosInfo(bTeam.heros)) do
  77 + for slot, hero in pairs(self:getTeamHerosInfo(bTeam).heros) do
77 78 selflist[slot] = hero.type
78 79 end
79 80 heroscore = self:getTeamBattleValue(bTeam.heros)
... ... @@ -86,8 +87,22 @@ function Role:checkBattle(battleType, params)
86 87 enemylist[#enemylist + 1] = one["unitType"]
87 88 end
88 89 end,
  90 + act_battle = function()
  91 + for slot, hero in pairs(self:getTeamHerosInfo(params).heros) do
  92 + selflist[slot] = hero.type
  93 + end
  94 + heroscore = self:getTeamBattleValue(params.heros)
  95 + for slot , one in pairs(params.supports) do
  96 + teamskill[one[1]] = one[2]
  97 + end
  98 + local carbonData = params.cfg
  99 + local monsterData = csvdb[carbonData.monster:match("/([^/]*)$") .. "Csv"]
  100 + for slot, one in pairs(monsterData[1]) do
  101 + enemylist[#enemylist + 1] = one["unitType"]
  102 + end
  103 + end,
89 104 pvpc = function()
90   - for slot, hero in pairs(self:getProperty("pvpTSC")) do
  105 + for slot, hero in pairs(self:getProperty("pvpTSC").heros) do
91 106 selflist[slot] = hero.type
92 107 end
93 108 heroscore = self:getProperty("pvpTBVC")
... ... @@ -109,7 +124,7 @@ function Role:checkBattle(battleType, params)
109 124 pvph = function()
110 125 for idx, team in pairs(self:getProperty("pvpTSH")) do
111 126 selflist[idx] = selflist[idx] or {}
112   - for slot, hero in pairs(team) do
  127 + for slot, hero in pairs(team.heros) do
113 128 selflist[idx][slot] = hero.type
114 129 end
115 130 end
... ... @@ -163,7 +178,7 @@ function Role:checkBattle(battleType, params)
163 178 mission_starttime = clientInfo.start or 0, -- 战斗开始时间,格式 unixtime 秒级
164 179 mission_roundtime = clientInfo.atime or 0, -- 对局时长(秒)
165 180 mission_result = params.isWin and 1 or 2, -- 战斗结果(0-无效,1-胜利,2-失败)
166   - mission_star = 0, -- 战斗完成星数,无星级的话填写0
  181 + mission_star = params.star or 0, -- 战斗完成星数,无星级的话填写0
167 182 mission_restriction = 0, -- 周期内参与限制(0表示没有上限)
168 183 mission_difficulty = 0, -- 关卡困难度,无难度区分的话填写0
169 184 mission_strength = 1, -- 消耗的体力或次数
... ...
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 购买/兑换行为
... ... @@ -42,6 +43,14 @@ local ItemReason = {
42 43 freeGift = 127, -- 免费礼包
43 44 exploreCommand = 128, -- 探索指令
44 45 drawHeroExtraReward = 129, -- 抽卡阶段奖励
  46 + actRecycle = 130, -- 活动道具回收
  47 + actExchange = 131, -- 兑换活动
  48 + actGachakon = 132, -- 扭蛋活动
  49 + totalRecharge = 133, -- 累计充值奖励
  50 + actHangDrop = 134, -- 掉落活动奖励
  51 + actBattle = 135, -- 活动关卡
  52 + actMilestone = 136, -- 活动关卡boss伤害里程碑
  53 + worldBossReward = 137, -- 世界boss翻牌奖励
45 54  
46 55  
47 56 advHang = 301, -- 拾荒挂机
... ... @@ -82,6 +91,7 @@ local ItemReason = {
82 91 actSign = 1007, -- 活动签到
83 92 actPaySign = 1008, -- 活动付费签到
84 93 calendaTask = 1009, -- 英雄帖
  94 + actMilecrisis = 1010, -- 物资危机
85 95  
86 96 -- 餐厅
87 97 greenHourse = 1101, -- 食材获得
... ... @@ -244,13 +254,6 @@ local MethodType = {
244 254 hero_break_result = "json", -- 英雄突破效果,可记录效果ID,或json格式记录提升效果,{攻击:20,闪避:20,……..}
245 255 hero_break_level = true, -- 英雄突破后等级上限
246 256 },
247   - hero_talent = { --英雄天赋升级
248   - hero_id = true, -- 英雄ID
249   - hero_talent_cost = "json", -- 英雄天赋升级消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
250   - hero_talent_levelbef = true, -- 英雄技能升级前等级
251   - hero_talent_level = true, -- 英雄技能升级后等级
252   - hero_talent_id = true, -- 天赋id
253   - },
254 257 hero_jewel = { --英雄铭文
255 258 hero_id = true, -- 英雄ID
256 259 hero_jewel_sequence = "ucode", -- 铭文装备编号,用以关联一次装备时产生的多条日志
... ... @@ -280,7 +283,7 @@ local MethodType = {
280 283 gacha_up = true, -- 卡池UP角色
281 284 gacha_times = true, -- 抽卡次数
282 285 gacha_reward = "json", -- 抽卡结果,建议使用json格式记录。示例:{ "XX": "1", "XXX": "3"}
283   - currency = "json", -- 消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
  286 + gacha_cost = "json", -- 消耗,json格式记录,{道具ID1:消耗数量1,道具ID2:消耗数量2,………...}
284 287 gacha_cnt = true, -- 保底计数
285 288 },
286 289 equip_wear = { --装备穿戴与卸载
... ... @@ -288,8 +291,8 @@ local MethodType = {
288 291 equip_id = true, --装备ID
289 292 equip_wear_action = true, --装备操作类型:装备:0,卸载:1
290 293 equip_wear_part = true, --装备部位,记录部位ID
291   - equip_wear_result = "json", --装备操作后结果,记录属性变化,json格式记录,{“aa”:1234,"bb":4567}
292   - equip_wear_change = "json", --装备操作变化值,记录属性变化,记录正负值,json格式记录,{“aa”:1234,"bb":-45}
  294 + equip_wear_scorebef = true, --装备前英雄评分
  295 + equip_wear_score = true, --装备后英雄评分
293 296 equip_wear_mode = true, --用以区分自动装备还是手动装备,自动记录为0,手动记录为1
294 297 equip_wear_seqid = "ucode", --自动穿戴时记录的系列ID,用以关联一次性装备时候产生的多条记录
295 298 },
... ... @@ -406,6 +409,7 @@ local MethodType = {
406 409 restaurant_order_status = true, -- 订单任务状态,接受:0, 拒绝:1, 完成:2
407 410 restaurant_order_rwd = "json", -- 订单完成奖励,json格式记录,{"itemid1":123,"itemid2":12,……….}
408 411 restaurant_order_lv = true, -- 订单品质等级,普通:0, 稀有:1, 顶级:2, 豪华:3
  412 + restaurant_order_type = true, -- 订单任务类型,0:特殊顾客,1:特别订单
409 413 },
410 414 restaurant_collect = { --餐厅顾客图谱
411 415 restaurant_collect_id = true, -- 图谱收集ID
... ... @@ -497,6 +501,28 @@ local MethodType = {
497 501 mission_pick_fund_beflv = true, -- 资助前资助等级
498 502 mission_pick_fund_aftlv = true, -- 资助后资助等级
499 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 +
500 526 }
501 527  
502 528 local function printError(info)
... ... @@ -517,20 +543,26 @@ local function isIos(self)
517 543 return sid == 2
518 544 end
519 545  
520   -local appid, sdkId
  546 +local sdkId
  547 +local AppId = {
  548 + [1] = 4787,
  549 + [2] = 4788,
  550 + [3] = 4789,
  551 +}
521 552 local function getBaseLog(self)
522 553 local uid = self:getProperty("uid")
523   - if not appid then
524   - appid, sdkId = string.match(uid, "(.*)_(.*)")
525   - if not appid then
  554 + local sid = self:getProperty("sid")
  555 + if not sdkId then
  556 + _, sdkId = string.match(uid, "(.*)_(.*)")
  557 + if not _ then
526 558 sdkId = uid
527   - appid = 0
528 559 end
529 560 end
  561 +
530 562 local log = {
531 563 server_id = server_id,
532 564 timestamp = skynet.timex(),
533   - app_id = appid,
  565 + app_id = AppId[sid] or 0,
534 566 plat_id = isIos(self) and 0 or 1,
535 567 sdk_uid = sdkId,
536 568 account_id = uid,
... ... @@ -558,6 +590,7 @@ local LogType = {
558 590 logout = "common",
559 591 guide = "common",
560 592 newdevice = "common",
  593 + cbback = "common",
561 594  
562 595 in_item = "common",
563 596 out_item = "common",
... ... @@ -758,8 +791,7 @@ function RoleLog.bind(Role)
758 791 end
759 792 end
760 793 end
761   - if not logd then return end
762   - pcall(skynet.send, logd, "lua", "log", doc, "bi")
  794 + logproxy:log(doc, "bi")
763 795 end
764 796  
765 797 function Role:logItems(itemId, before, after, log)
... ... @@ -818,8 +850,7 @@ function RoleLog.bind(Role)
818 850 end
819 851 end
820 852 doc["@type"] = logType
821   - if not logd then return end
822   - pcall(skynet.send, logd, "lua", "log", doc, "log")
  853 + logproxy:log(doc, "log")
823 854 end
824 855  
825 856  
... ...
src/models/RolePlugin.lua
... ... @@ -102,6 +102,35 @@ function RolePlugin.bind(Role)
102 102 [ItemType.FuncOpen] = function()
103 103 self:funcOpen(itemId, count, pms)
104 104 end,
  105 + [ItemType.HeroFCommon] = function()
  106 + if itemData.use_type == 2 then
  107 + local randomData = csvdb["item_randomCsv"][tonumber(itemData.use_effect)]
  108 + for _i = 1, count do
  109 + for i = 1, 10 do
  110 + local num = randomData["num" .. i]
  111 + local gift = randomData["gift" .. i]
  112 + if num and gift and num > 0 and gift ~= "" then
  113 + local pool = {}
  114 + for _, temp in ipairs(gift:toArray()) do
  115 + table.insert(pool, temp:toArray(true, "="))
  116 + end
  117 + local needCount = math.min(#pool, num)
  118 + for j = 1, needCount do
  119 + local idx = math.randWeight(pool, 3)
  120 + change[pool[idx][1]] = (change[pool[idx][1]] or 0) + pool[idx][2]
  121 + table.remove(pool, idx)
  122 + end
  123 + end
  124 + end
  125 + end
  126 + change[0] = nil
  127 + count = 0
  128 + else
  129 + pms.itemId = itemId
  130 + pms.count = count
  131 + self:addItem(pms)
  132 + end
  133 + end,
105 134 }
106 135 -- 对数量筛查
107 136 count = checkItemCount(self, itemId, count)
... ... @@ -327,16 +356,41 @@ function RolePlugin.bind(Role)
327 356 if not self:costDiamond(pms) then
328 357 return
329 358 end
330   - itemCountT[ItemId.Diamond] = nil
331 359 end
332 360 for itemId, count in pairs(itemCountT) do
333   - pms.itemId = itemId
334   - pms.count = - count
335   - 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
336 367 end
337 368 return true
338 369 end
339 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 +
340 394 function Role:getItemCount(itemId)
341 395 if itemId == ItemId.Diamond then
342 396 return self:getAllDiamond()
... ... @@ -806,50 +860,50 @@ function RolePlugin.bind(Role)
806 860 SendPacket(actionCodes.Sys_maintainNotice, MsgPack.pack({ body = text, iskey = not isNotKey}))
807 861 end
808 862  
809   - function Role:getHeroActiveRelationData(heros)
810   - local relations = {}
811   - for _, id in pairs(heros or {}) do
812   - local hero = self.heros[id]
813   - if hero then
814   - local camp = csvdb["unitCsv"][hero:getProperty("type")].camp
815   - relations[camp] = (relations[camp] or 0) + 1
816   - end
817   - end
818   - local curData = csvdb["unit_relationCsv"][0]
819   - if not next(relations) then return curData end
  863 + -- function Role:getHeroActiveRelationData(heros)
  864 + -- local relations = {}
  865 + -- for _, id in pairs(heros or {}) do
  866 + -- local hero = self.heros[id]
  867 + -- if hero then
  868 + -- local camp = csvdb["unitCsv"][hero:getProperty("type")].camp
  869 + -- relations[camp] = (relations[camp] or 0) + 1
  870 + -- end
  871 + -- end
  872 + -- local curData = csvdb["unit_relationCsv"][0]
  873 + -- if not next(relations) then return curData end
820 874  
821   - for _, data in ipairs(csvdb["unit_relationCsv"]) do
822   - local had = {}
823   - local isDone = true
824   - for _, count in pairs(data.relation:toArray(true, "=")) do
825   - local find = false
826   - for camp, _count in pairs(relations) do
827   - if count == _count and not had[camp] then
828   - had[camp] = true
829   - find = true
830   - break
831   - end
832   - end
833   - if not find then
834   - isDone = false
835   - break
836   - end
837   - end
838   - if isDone then
839   - curData = data
840   - end
841   - end
842   - return curData
843   - end
844   -
845   - function Role:getHeroActiveRelation(heros)
846   - local data = self:getHeroActiveRelationData(heros)
847   - local result = {}
848   - for attr, value in pairs(data.effect:toNumMap()) do
849   - result[AttsEnumEx[attr]] = (result[AttsEnumEx[attr]] or 0) + value
850   - end
851   - return result
852   - end
  875 + -- for _, data in ipairs(csvdb["unit_relationCsv"]) do
  876 + -- local had = {}
  877 + -- local isDone = true
  878 + -- for _, count in pairs(data.relation:toArray(true, "=")) do
  879 + -- local find = false
  880 + -- for camp, _count in pairs(relations) do
  881 + -- if count == _count and not had[camp] then
  882 + -- had[camp] = true
  883 + -- find = true
  884 + -- break
  885 + -- end
  886 + -- end
  887 + -- if not find then
  888 + -- isDone = false
  889 + -- break
  890 + -- end
  891 + -- end
  892 + -- if isDone then
  893 + -- curData = data
  894 + -- end
  895 + -- end
  896 + -- return curData
  897 + -- end
  898 +
  899 + -- function Role:getHeroActiveRelation(heros)
  900 + -- local data = self:getHeroActiveRelationData(heros)
  901 + -- local result = {}
  902 + -- for attr, value in pairs(data.effect:toNumMap()) do
  903 + -- result[AttsEnumEx[attr]] = (result[AttsEnumEx[attr]] or 0) + value
  904 + -- end
  905 + -- return result
  906 + -- end
853 907  
854 908 function Role:getHerosCamp(heros)
855 909 local had = {}
... ... @@ -870,14 +924,16 @@ function RolePlugin.bind(Role)
870 924 return curCamp
871 925 end
872 926  
873   - function Role:getRealBattleValue(heros, activeRelation) -- 获取队伍战斗力 羁绊加成
  927 + -- function Role:getRealBattleValue(heros, activeRelation) -- 获取队伍战斗力 羁绊加成
  928 + function Role:getRealBattleValue(heros) -- 获取队伍战斗力 羁绊加成
874 929 heros = heros or {}
875   - local activeRelation = activeRelation or self:getHeroActiveRelation(heros)
  930 + -- local activeRelation = activeRelation or self:getHeroActiveRelation(heros)
876 931 local battleValue = 0
877 932 for _, id in pairs(heros) do
878 933 local hero = self.heros[id]
879 934 if hero then
880   - battleValue = battleValue + hero:getBattleValue(activeRelation)
  935 + -- battleValue = battleValue + hero:getBattleValue(activeRelation)
  936 + battleValue = battleValue + hero:getBattleValue()
881 937 end
882 938 end
883 939 return battleValue
... ... @@ -983,6 +1039,7 @@ function RolePlugin.bind(Role)
983 1039  
984 1040 if csvdb["itemCsv"][func] and csvdb["itemCsv"][func].type == ItemType.FuncOpen then
985 1041 local unlockData = csvdb["unlockCsv"][func]
  1042 + self:log("function_open", {function_id = func})
986 1043 if unlockData.type == 4 then -- 解锁神器
987 1044 if self:getProperty("advAFOpen")[unlockData.value1] ~= 1 then
988 1045 self:changeUpdates({{type = "advAFOpen", field = unlockData.value1, value = 1}})
... ... @@ -1145,7 +1202,7 @@ function RolePlugin.bind(Role)
1145 1202 lv = self:getProperty("level"),
1146 1203 batteV = battleV,
1147 1204 level = level,
1148   - format = self:getTeamHerosInfo(towerTeam.heros),
  1205 + format = self:getTeamHerosInfo(towerTeam).heros,
1149 1206 }
1150 1207 local roleId = self:getProperty("id")
1151 1208 redisproxy:pipelining(function (red)
... ... @@ -1263,7 +1320,7 @@ function RolePlugin.bind(Role)
1263 1320  
1264 1321 function Role:getTeamBattleInfo(team)
1265 1322 local teamInfo = {heros = {}, supports = {}}
1266   - local activeRelation = self:getHeroActiveRelation(team.heros)
  1323 + -- local activeRelation = self:getHeroActiveRelation(team.heros)
1267 1324  
1268 1325 for slot, id in pairs(team.heros or {}) do
1269 1326 local info = {}
... ... @@ -1271,7 +1328,8 @@ function RolePlugin.bind(Role)
1271 1328 if not hero then
1272 1329 print("error heroid " .. id)
1273 1330 end
1274   - local attrs = hero:getTotalAttrs({activeRelation = activeRelation})
  1331 + -- local attrs = hero:getTotalAttrs({activeRelation = activeRelation})
  1332 + local attrs = hero:getTotalAttrs()
1275 1333 for k, v in pairs(AttsEnumEx) do
1276 1334 info[v] = (attrs[v] or 0)
1277 1335 end
... ... @@ -1292,9 +1350,10 @@ function RolePlugin.bind(Role)
1292 1350 return teamInfo
1293 1351 end
1294 1352  
1295   - function Role:getTeamHerosInfo(heroIds)
  1353 + function Role:getTeamHerosInfo(team)
  1354 + local format = {}
1296 1355 local heros = {}
1297   - for slot, heroId in pairs(heroIds or {}) do
  1356 + for slot, heroId in pairs(team.heros or {}) do
1298 1357 local hero = self.heros[heroId]
1299 1358 heros[slot] = {
1300 1359 type = hero:getProperty("type"),
... ... @@ -1302,7 +1361,10 @@ function RolePlugin.bind(Role)
1302 1361 wakeL = hero:getProperty("wakeL"),
1303 1362 }
1304 1363 end
1305   - return heros
  1364 + format.heros = heros
  1365 + format.supports = team.supports or {}
  1366 + format.tactics = team.tactics or nil
  1367 + return format
1306 1368 end
1307 1369  
1308 1370 function Role:getTeamBattleValue(heros)
... ... @@ -1320,7 +1382,7 @@ function RolePlugin.bind(Role)
1320 1382 if not team then return end
1321 1383  
1322 1384 self:setProperties({
1323   - hangTS = self:getTeamHerosInfo(team.heros),
  1385 + hangTS = self:getTeamHerosInfo(team),
1324 1386 hangTB = self:getTeamBattleInfo(team),
1325 1387 hangTBV = self:getTeamBattleValue(team.heros),
1326 1388 })
... ... @@ -1368,7 +1430,7 @@ function RolePlugin.bind(Role)
1368 1430 self:updateProperty({field = "pvpTC", value = team})
1369 1431 end
1370 1432 self:setProperties({
1371   - pvpTSC = self:getTeamHerosInfo(team.heros),
  1433 + pvpTSC = self:getTeamHerosInfo(team),
1372 1434 pvpTBC = self:getTeamBattleInfo(team),
1373 1435 pvpTBVC = self:getTeamBattleValue(team.heros),
1374 1436 })
... ... @@ -1384,7 +1446,7 @@ function RolePlugin.bind(Role)
1384 1446 local pvpTSH, pvpTBH, pvpTBVH = {}, {}, {}
1385 1447 for i = 1, 3 do
1386 1448 if team[i] then
1387   - pvpTSH[i] = self:getTeamHerosInfo(team[i].heros)
  1449 + pvpTSH[i] = self:getTeamHerosInfo(team[i])
1388 1450 pvpTBH[i] = self:getTeamBattleInfo(team[i])
1389 1451 pvpTBVH[i] = self:getTeamBattleValue(team[i].heros)
1390 1452 end
... ... @@ -1543,10 +1605,17 @@ function RolePlugin.bind(Role)
1543 1605 return ""
1544 1606 end
1545 1607 local limit = rechargeData.limit
1546   - local rechargeRecord = self:getProperty("payR") or {}
  1608 + local rechargeRecord = self.storeData:getProperty("payR") or {}
1547 1609 if limit ~= 0 and limit <= (rechargeRecord[rechargeId] or 0) then
1548 1610 return ""
1549   - 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
1550 1619  
1551 1620 local orderId = redisproxy:hget(string.format(R_ORDERS, roleId), rechargeId)
1552 1621 if orderId then
... ... @@ -1564,6 +1633,7 @@ function RolePlugin.bind(Role)
1564 1633 key = orderKey,
1565 1634 order = partnerOrderId,
1566 1635 rechargeId = rechargeId,
  1636 + createTime = skynet.timex(),
1567 1637 })
1568 1638 order:create()
1569 1639 -- 正在进行中的订单 缓存
... ... @@ -1607,7 +1677,7 @@ function RolePlugin.bind(Role)
1607 1677 -- 开始下单
1608 1678 if status == "success" then
1609 1679 elseif status == "fail" then
1610   - redisproxy:hdel(string.format(R_ORDERS, roleId), rechargeId)
  1680 + -- redisproxy:hdel(string.format(R_ORDERS, roleId), rechargeId)
1611 1681 elseif status == "finsh" then
1612 1682 orderObject:setProperty("finishTime", skynet.time())
1613 1683 redisproxy:hdel(string.format(R_ORDERS, roleId), rechargeId)
... ... @@ -1792,10 +1862,10 @@ function RolePlugin.bind(Role)
1792 1862 end
1793 1863  
1794 1864 -- 抽卡阶段奖励
1795   - function Role:getDrawCardExtraReward(oldVal, newVal)
  1865 + function Role:getDrawCardExtraReward(feedbackId, oldVal, newVal)
1796 1866 local reward = nil
1797 1867 local maxCount = 0
1798   - for k, v in pairs(csvdb["build_extraRewardCsv"]) do
  1868 + for k, v in pairs(csvdb["build_extraRewardCsv"][feedbackId]) do
1799 1869 if oldVal < k and newVal >= k then
1800 1870 reward = v["reward"] or ""
1801 1871 end
... ... @@ -1897,6 +1967,53 @@ function RolePlugin.bind(Role)
1897 1967 end
1898 1968 deleteNotify({pattern = pattern})
1899 1969 end
  1970 +
  1971 + local CommonRankTime = toUnixtime("2019010100")
  1972 + local CommonCoef1 = 10000
  1973 + local CommonCoef2 = 10000
  1974 + function Role:updateRankCommon(rankType, rankVal, reserve)
  1975 + if not rankType then return end
  1976 + reserve = reserve or 0
  1977 + local now = skynet.timex()
  1978 + local ct = math.ceil((now - CommonRankTime) / 86400) --按天计算 365 * 27 < 10000 可以维持 27 年
  1979 + ct = 10000 - ct -- 越早的排名越靠前
  1980 + local score = (rankVal * CommonCoef1 + ct) * CommonCoef2 + reserve
  1981 +
  1982 + local roleId = self:getProperty("id")
  1983 + redisproxy:pipelining(function (red)
  1984 + red:zadd(RANK_COMMON..rankType, score, roleId) --更新分数
  1985 + end)
  1986 + end
  1987 +
  1988 + function Role:getRankInfoCommon(rankType)
  1989 + if not rankType then return end
  1990 + local list = {}
  1991 + local rankKey = RANK_COMMON .. rankType
  1992 + local ids = redisproxy:zrevrange(rankKey, 0 , 99, "WITHSCORES")
  1993 + for i = 1, #ids, 2 do
  1994 + local roleId = tonumber(ids[i])
  1995 + local rankVal = tonumber(ids[i + 1])
  1996 + rankVal = math.floor(math.floor(rankVal / CommonCoef2) / CommonCoef1)
  1997 + table.insert(list, {roleId = roleId, player = rankVal})
  1998 + end
  1999 +
  2000 + for _, v in ipairs(list) do
  2001 + local _, curInfo = rpcRole(v.roleId, "friendSInfo")
  2002 + curInfo.ltime = nil
  2003 + curInfo.rankVal = v.player
  2004 + v.player = curInfo
  2005 + end
  2006 +
  2007 + local rank = redisproxy:ZREVRANK(rankKey, self:getProperty("id"))
  2008 + if not rank then
  2009 + rank = -1
  2010 + else
  2011 + rank = rank + 1
  2012 + end
  2013 + return {list = list, rank = rank}
  2014 + end
  2015 +
  2016 +
1900 2017 end
1901 2018  
1902 2019 return RolePlugin
1903 2020 \ No newline at end of file
... ...
src/models/RolePvp.lua
... ... @@ -6,7 +6,12 @@ RolePvp.bind = function (Role)
6 6 local PVP_RANK_TIME_SORT_STD = 1924876800 -- 2030-12-31 00:00:00
7 7 local PVP_RANK_TIME_SORT_PLACE = 1000000 -- 时间戳占据 6位数
8 8 local PVP_RANK_TIME_SORT_PRECISION = 360 -- 时间精度 每6分钟忽略差异
9   -local PVP_RANK_ROBOT_SCORE = globalCsv.pvp_base_score -- 机器人积分
  9 +local PVP_RANK_BASE_SCORE = globalCsv.pvp_base_score -- 初始积分
  10 +
  11 +-- 匹配规则改为以排名来匹配
  12 +local PVP_GET_ROBOT_SCORE = 2400 -- 2400分以下低档位匹配机器人
  13 +local PRE_RANGE_COUNT = 20 -- 每个档位人数
  14 +local NEED_MATCH = 3 --匹配到多少人
10 15  
11 16  
12 17 function Role:unpackPvpScore(score)
... ... @@ -34,7 +39,7 @@ function Role:changePvpScore(rankKey, changeScoreCallback, matchId)
34 39 end)
35 40 local myScore = self:unpackPvpScore(redret[1])
36 41 local oldMyRank = tonumber(redret[2] or -2) + 1
37   - local matchScore = PVP_RANK_ROBOT_SCORE
  42 + local matchScore = PVP_RANK_BASE_SCORE
38 43 if isPlayer then
39 44 matchScore = self:unpackPvpScore(redret[3])
40 45 end
... ... @@ -68,7 +73,7 @@ function Role:changePvpScoreCommon(matchId, isWin)
68 73 if isWin then
69 74 local scoreChange = math.ceil(60 / (1 + 10 ^ ((myScore - matchScore) / 400)))
70 75 myScore = myScore + scoreChange
71   - matchScore = matchScore - scoreChange
  76 + matchScore = matchScore - math.ceil(scoreChange / 3) -- 防守方失败时,扣分减为原来的1/3
72 77 else
73 78 local scoreChange = math.ceil(60 / (1 + 10 ^ ((matchScore - myScore) / 400)))
74 79 myScore = myScore - scoreChange
... ... @@ -78,7 +83,7 @@ function Role:changePvpScoreCommon(matchId, isWin)
78 83 end
79 84  
80 85 local result = self:changePvpScore(RANK_PVP_COMMON, changeScoreCallback, matchId)
81   - self:refreshPvpMatchC(result[1])
  86 + self:refreshPvpMatchC(result[1], result[5])
82 87 return table.unpack(result)
83 88 end
84 89  
... ... @@ -134,7 +139,7 @@ function Role:changePvpScoreHigh(matchId, isWin)
134 139 if isWin then
135 140 local scoreChange = math.ceil(50 / (1 + 10 ^ ((myScore - matchScore) / 1000)))
136 141 myScore = myScore + scoreChange
137   - matchScore = matchScore - scoreChange
  142 + matchScore = matchScore - math.ceil(scoreChange / 3) -- 防守方失败时,扣分减为原来的1/3
138 143 else
139 144 local scoreChange = math.ceil(50 / (1 + 10 ^ ((matchScore - myScore) / 1000)))
140 145 myScore = myScore - scoreChange
... ... @@ -162,85 +167,50 @@ function Role:changePvpScoreHigh(matchId, isWin)
162 167 })
163 168 end
164 169  
165   - self:refreshPvpMatchH(result[1])
  170 + self:refreshPvpMatchH(result[1], result[5])
166 171 return table.unpack(result)
167 172 end
168 173  
169   -function Role:refreshPvpMatch(score, rankKey)
  174 +function Role:isInPvpRank(rankKey)
  175 + local Fields = {
  176 + [RANK_PVP_COMMON] = "pvpMC",
  177 + [RANK_PVP_HIGHT] = "pvpMH",
  178 + }
  179 + local dbKey = self:getPvpDBKey(rankKey)
  180 + local roleId = self:getProperty("id")
  181 + if redisproxy:zscore(dbKey, roleId) then
  182 + return true
  183 + end
  184 + return false
  185 +end
170 186  
  187 +-- 新的匹配规则
  188 +function Role:refreshPvpMatch(score, rank, rankKey)
171 189 local Fields = {
172 190 [RANK_PVP_COMMON] = "pvpMC",
173 191 [RANK_PVP_HIGHT] = "pvpMH",
174 192 }
175 193 local RobotCsvs = {
176 194 [RANK_PVP_COMMON] = "pvp_robotCsv",
177   - [RANK_PVP_HIGHT] = "pvp_robotCsv",
  195 + [RANK_PVP_HIGHT] = "pvp_robot_groupCsv",
178 196 }
  197 +
179 198 local mField = Fields[rankKey]
180 199 local robotCsv = RobotCsvs[rankKey]
181   - local dbKey = self:getPvpDBKey(rankKey)
182 200  
  201 + local dbKey = self:getPvpDBKey(rankKey)
183 202 local roleId = self:getProperty("id")
184   - score = score or self:unpackPvpScore(redisproxy:zscore(dbKey, roleId))
185   -
186   - local function getPlayers(levels)
  203 + if not score and not rank then
187 204 local redret = redisproxy:pipelining(function(red)
188   - for _, level in ipairs(levels) do
189   - local low, high = table.unpack(level)
190   - red:zadd(dbKey, low * PVP_RANK_TIME_SORT_PLACE, "std_temp1")
191   - red:zadd(dbKey, high * PVP_RANK_TIME_SORT_PLACE + PVP_RANK_TIME_SORT_PLACE - 1, "std_temp2")
192   - red:ZREVRANK(dbKey, "std_temp1")
193   - red:ZREVRANK(dbKey, "std_temp2")
194   - end
195   - red:zrem(dbKey, "std_temp1", "std_temp2")
  205 + red:zscore(dbKey, roleId)
  206 + red:zrevrank(dbKey, roleId)
196 207 end)
197   -
198   - local PreGetCount = 7
199   - local redret = redisproxy:pipelining(function(red)
200   - for idx, level in ipairs(levels) do
201   - local rank1 = tonumber(redret[(idx - 1) * 4 + 3])
202   - local rank2 = tonumber(redret[(idx - 1) * 4 + 4])
203   - if rank1 - rank2 > PreGetCount then
204   - rank2 = math.randomInt(rank2, rank1 - PreGetCount + 1)
205   - rank1 = rank2 + PreGetCount - 1
206   - end
207   - red:ZREVRANGE(dbKey, rank2, rank1)
208   - end
209   - end)
210   - return redret
211   - end
212   -
213   - local findIdx = #globalCsv.pvp_division
214   - for idx, limit in ipairs(globalCsv.pvp_division) do
215   - if score < limit then
216   - findIdx = idx - 1
217   - break
218   - end
  208 + score = self:unpackPvpScore(redret[1])
  209 + rank = tonumber(redret[2] or -2) + 1
219 210 end
220   - local levels = {
221   - {}, {}, {}
222   - }
223   - if globalCsv.pvp_division[findIdx + 1] then
224   - levels[1] = {globalCsv.pvp_division[findIdx + 1], (globalCsv.pvp_division[findIdx + 2] or 100000000) - 1}
225   - end
226   - levels[2] = {globalCsv.pvp_division[findIdx], (globalCsv.pvp_division[findIdx + 1] or 100000000) - 1}
227   - if globalCsv.pvp_division[findIdx - 1] then
228   - levels[3] = {globalCsv.pvp_division[findIdx - 1], globalCsv.pvp_division[findIdx] - 1}
229   - end
230   - local redirect = {}
231   - for i = #levels , 1, -1 do
232   - if not next(levels[i]) then
233   - table.remove(levels, i)
234   - redirect[i] = -1
235   - for _, v in pairs(redirect) do
236   - redirect[_] = v - 1
237   - end
238   - else
239   - redirect[i] = i
240   - end
241   - end
242   -
243   - local result = getPlayers(levels)
  211 + score = score or self:unpackPvpScore(redisproxy:zscore(dbKey, roleId))
  212 + rank = rank or tonumber(redisproxy:zrevrank(dbKey, roleId) or -2) + 1
  213 +
244 214 local match = self:getProperty(mField)
245 215 local hadPlayer = {[roleId] = 1}
246 216 local hadRobot = {}
... ... @@ -252,97 +222,260 @@ function Role:refreshPvpMatch(score, rankKey)
252 222 end
253 223 end
254 224  
255   - for _, temp in pairs(result) do
256   - for i = #temp, 1, -1 do
257   - local id = tonumber(temp[i])
258   - if hadPlayer[id] then
259   - table.remove(temp, i)
260   - else
261   - temp[i] = id
262   - hadPlayer[id] = 1
263   - end
  225 + local tempMatch = {}
  226 + local needRobot = 0
  227 + -- -1 没有上榜
  228 + if rank == -1 then
  229 + needRobot = NEED_MATCH
  230 + else
  231 + local need = PRE_RANGE_COUNT * NEED_MATCH
  232 + local low, heigh = math.floor(rank - need / 2 - 1), math.floor(rank + need / 2 - 1)
  233 + if low < 0 then
  234 + low = 0
264 235 end
265   - end
266   - -- 增加第几个
267   - local function getPlayer(idx)
268   - for i = idx, 3 do
269   - if redirect[i] ~= -1 then
270   - local curR = result[redirect[i]] or {}
271   - if next(curR) then
272   - local curIdx = math.randomInt(1, #curR)
273   - local objId = curR[curIdx]
274   - table.remove(curR, curIdx)
275   - return objId
276   - end
  236 + local rangeIds = redisproxy:ZREVRANGE(dbKey, low, heigh)
  237 + local lastRangeIds = {}
  238 + for idx, one in ipairs(rangeIds) do
  239 + local cid = tonumber(one)
  240 + if not hadPlayer[cid] then
  241 + lastRangeIds[#lastRangeIds + 1] = cid
277 242 end
278 243 end
279   - end
280   -
281   - local tempMatch = {}
282   - local curCount = 0
283   - for i = 1, 3 do
284   - local objId = getPlayer(i)
285   - if objId then
286   - tempMatch[i] = {t = 1, id = objId}
287   - curCount = curCount + 1
  244 + if score < PVP_GET_ROBOT_SCORE then
  245 + needRobot = 1
288 246 end
289   - end
290   -
291   - -- 正常的玩家不够了 低一档继续
292   - if curCount < 3 then
293   - local level = nil
294   - if globalCsv.pvp_division[findIdx - 2] then
295   - level = {globalCsv.pvp_division[findIdx - 2], globalCsv.pvp_division[findIdx - 1] - 1}
  247 + local len = #lastRangeIds
  248 + if len < NEED_MATCH then
  249 + needRobot = NEED_MATCH - len
296 250 end
297   - if level then
298   - local result = getPlayers({level})[1] or {}
299   - for i = #result, 1, -1 do
300   - local id = tonumber(result[i])
301   - if hadPlayer[id] then
302   - table.remove(result, i)
303   - else
304   - result[i] = id
305   - hadPlayer[id] = 1
306   - end
  251 + local needPlayer = NEED_MATCH - needRobot
  252 + if needPlayer > 0 then
  253 + local pre = math.floor(len / needPlayer)
  254 + for i = 1, needPlayer do
  255 + local idx = math.randomInt((i - 1) * pre + 1, i * pre)
  256 + tempMatch[#tempMatch + 1] = {t = 1, id = lastRangeIds[idx]}
307 257 end
  258 + end
308 259  
309   - if next(result) then
310   - for i = curCount + 1, 3 do
311   - local curIdx = math.randomInt(1, #result)
312   - local objId = result[curIdx]
313   - table.remove(result, curIdx)
314   - tempMatch[i] = {t = 1, id = objId}
315   - curCount = curCount + 1
316   - if not next(result) then
317   - break
318   - end
319   - end
  260 + end
  261 + if needRobot > 0 then
  262 + local RobotPoolCount = 20
  263 + local max = #csvdb[robotCsv]
  264 + local min = 1
  265 + local mid
  266 + while min <= max do
  267 + mid = math.floor((min + max) / 2)
  268 + local tempPt = csvdb[robotCsv][mid].pt
  269 + if score == tempPt then
  270 + break
  271 + elseif score > tempPt then
  272 + min = mid + 1
  273 + elseif score < tempPt then
  274 + max = mid - 1
320 275 end
321 276 end
322   - end
323   -
324   - -- 增加机器人
325   - if curCount < 3 then
326   - for i = curCount + 1, 3 do
327   - while true do
328   - local id = math.randomInt(1, #csvdb[robotCsv])
329   - if not hadRobot[id] then
330   - hadRobot[id] = 1
331   - tempMatch[i] = {t = 2, id = id}
332   - break
333   - end
  277 + assert(mid, "pvp no robot " .. robotCsv)
  278 + local low = mid - RobotPoolCount / 2
  279 + local heigh = mid + RobotPoolCount / 2
  280 + if low < 1 then
  281 + heigh = heigh + (1 - low)
  282 + low = 1
  283 + end
  284 + if heigh > #csvdb[robotCsv] then
  285 + heigh = #csvdb[robotCsv]
  286 + end
  287 + local pools = {}
  288 + for i = low, heigh do
  289 + if not hadRobot[i] then
  290 + pools[#pools + 1] = i
334 291 end
335 292 end
  293 + local pre = math.floor(#pools / needRobot)
  294 + for i = 1, needRobot do
  295 + local idx = math.randomInt((i - 1) * pre + 1, i * pre)
  296 + tempMatch[#tempMatch + 1] = {t = 2, id = pools[idx]}
  297 + end
336 298 end
337 299 self:setProperty(mField, tempMatch)
338 300 end
339 301  
340   -function Role:refreshPvpMatchC(score)
341   - self:refreshPvpMatch(score, RANK_PVP_COMMON)
  302 +-- function Role:refreshPvpMatch(score, rank, rankKey)
  303 +
  304 +-- local Fields = {
  305 +-- [RANK_PVP_COMMON] = "pvpMC",
  306 +-- [RANK_PVP_HIGHT] = "pvpMH",
  307 +-- }
  308 +-- local RobotCsvs = {
  309 +-- [RANK_PVP_COMMON] = "pvp_robotCsv",
  310 +-- [RANK_PVP_HIGHT] = "pvp_robotCsv",
  311 +-- }
  312 +-- local mField = Fields[rankKey]
  313 +-- local robotCsv = RobotCsvs[rankKey]
  314 +-- local dbKey = self:getPvpDBKey(rankKey)
  315 +
  316 +-- local roleId = self:getProperty("id")
  317 +-- score = score or self:unpackPvpScore(redisproxy:zscore(dbKey, roleId))
  318 +
  319 +-- local function getPlayers(levels)
  320 +-- local redret = redisproxy:pipelining(function(red)
  321 +-- for _, level in ipairs(levels) do
  322 +-- local low, high = table.unpack(level)
  323 +-- red:zadd(dbKey, low * PVP_RANK_TIME_SORT_PLACE, "std_temp1")
  324 +-- red:zadd(dbKey, high * PVP_RANK_TIME_SORT_PLACE + PVP_RANK_TIME_SORT_PLACE - 1, "std_temp2")
  325 +-- red:ZREVRANK(dbKey, "std_temp1")
  326 +-- red:ZREVRANK(dbKey, "std_temp2")
  327 +-- end
  328 +-- red:zrem(dbKey, "std_temp1", "std_temp2")
  329 +-- end)
  330 +
  331 +-- local PreGetCount = 7
  332 +-- local redret = redisproxy:pipelining(function(red)
  333 +-- for idx, level in ipairs(levels) do
  334 +-- local rank1 = tonumber(redret[(idx - 1) * 4 + 3])
  335 +-- local rank2 = tonumber(redret[(idx - 1) * 4 + 4])
  336 +-- if rank1 - rank2 > PreGetCount then
  337 +-- rank2 = math.randomInt(rank2, rank1 - PreGetCount + 1)
  338 +-- rank1 = rank2 + PreGetCount - 1
  339 +-- end
  340 +-- red:ZREVRANGE(dbKey, rank2, rank1)
  341 +-- end
  342 +-- end)
  343 +-- return redret
  344 +-- end
  345 +
  346 +-- local findIdx = #globalCsv.pvp_division
  347 +-- for idx, limit in ipairs(globalCsv.pvp_division) do
  348 +-- if score < limit then
  349 +-- findIdx = idx - 1
  350 +-- break
  351 +-- end
  352 +-- end
  353 +-- local levels = {
  354 +-- {}, {}, {}
  355 +-- }
  356 +-- if globalCsv.pvp_division[findIdx + 1] then
  357 +-- levels[1] = {globalCsv.pvp_division[findIdx + 1], (globalCsv.pvp_division[findIdx + 2] or 100000000) - 1}
  358 +-- end
  359 +-- levels[2] = {globalCsv.pvp_division[findIdx], (globalCsv.pvp_division[findIdx + 1] or 100000000) - 1}
  360 +-- if globalCsv.pvp_division[findIdx - 1] then
  361 +-- levels[3] = {globalCsv.pvp_division[findIdx - 1], globalCsv.pvp_division[findIdx] - 1}
  362 +-- end
  363 +-- local redirect = {}
  364 +-- for i = #levels , 1, -1 do
  365 +-- if not next(levels[i]) then
  366 +-- table.remove(levels, i)
  367 +-- redirect[i] = -1
  368 +-- for _, v in pairs(redirect) do
  369 +-- redirect[_] = v - 1
  370 +-- end
  371 +-- else
  372 +-- redirect[i] = i
  373 +-- end
  374 +-- end
  375 +
  376 +-- local result = getPlayers(levels)
  377 +-- local match = self:getProperty(mField)
  378 +-- local hadPlayer = {[roleId] = 1}
  379 +-- local hadRobot = {}
  380 +-- for _, one in pairs(match) do
  381 +-- if one.t == 1 then
  382 +-- hadPlayer[one.id] = 1
  383 +-- elseif one.t == 2 then
  384 +-- hadRobot[one.id] = 1
  385 +-- end
  386 +-- end
  387 +
  388 +-- for _, temp in pairs(result) do
  389 +-- for i = #temp, 1, -1 do
  390 +-- local id = tonumber(temp[i])
  391 +-- if hadPlayer[id] then
  392 +-- table.remove(temp, i)
  393 +-- else
  394 +-- temp[i] = id
  395 +-- hadPlayer[id] = 1
  396 +-- end
  397 +-- end
  398 +-- end
  399 +-- -- 增加第几个
  400 +-- local function getPlayer(idx)
  401 +-- for i = idx, 3 do
  402 +-- if redirect[i] ~= -1 then
  403 +-- local curR = result[redirect[i]] or {}
  404 +-- if next(curR) then
  405 +-- local curIdx = math.randomInt(1, #curR)
  406 +-- local objId = curR[curIdx]
  407 +-- table.remove(curR, curIdx)
  408 +-- return objId
  409 +-- end
  410 +-- end
  411 +-- end
  412 +-- end
  413 +
  414 +-- local tempMatch = {}
  415 +-- local curCount = 0
  416 +-- for i = 1, 3 do
  417 +-- local objId = getPlayer(i)
  418 +-- if objId then
  419 +-- tempMatch[i] = {t = 1, id = objId}
  420 +-- curCount = curCount + 1
  421 +-- end
  422 +-- end
  423 +
  424 +-- -- 正常的玩家不够了 低一档继续
  425 +-- if curCount < 3 then
  426 +-- local level = nil
  427 +-- if globalCsv.pvp_division[findIdx - 2] then
  428 +-- level = {globalCsv.pvp_division[findIdx - 2], globalCsv.pvp_division[findIdx - 1] - 1}
  429 +-- end
  430 +-- if level then
  431 +-- local result = getPlayers({level})[1] or {}
  432 +-- for i = #result, 1, -1 do
  433 +-- local id = tonumber(result[i])
  434 +-- if hadPlayer[id] then
  435 +-- table.remove(result, i)
  436 +-- else
  437 +-- result[i] = id
  438 +-- hadPlayer[id] = 1
  439 +-- end
  440 +-- end
  441 +
  442 +-- if next(result) then
  443 +-- for i = curCount + 1, 3 do
  444 +-- local curIdx = math.randomInt(1, #result)
  445 +-- local objId = result[curIdx]
  446 +-- table.remove(result, curIdx)
  447 +-- tempMatch[i] = {t = 1, id = objId}
  448 +-- curCount = curCount + 1
  449 +-- if not next(result) then
  450 +-- break
  451 +-- end
  452 +-- end
  453 +-- end
  454 +-- end
  455 +-- end
  456 +
  457 +-- -- 增加机器人
  458 +-- if curCount < 3 then
  459 +-- for i = curCount + 1, 3 do
  460 +-- while true do
  461 +-- local id = math.randomInt(1, #csvdb[robotCsv])
  462 +-- if not hadRobot[id] then
  463 +-- hadRobot[id] = 1
  464 +-- tempMatch[i] = {t = 2, id = id}
  465 +-- break
  466 +-- end
  467 +-- end
  468 +-- end
  469 +-- end
  470 +-- self:setProperty(mField, tempMatch)
  471 +-- end
  472 +
  473 +function Role:refreshPvpMatchC(score, rank)
  474 + self:refreshPvpMatch(score, rank, RANK_PVP_COMMON)
342 475 end
343 476  
344   -function Role:refreshPvpMatchH(score)
345   - self:refreshPvpMatch(score, RANK_PVP_HIGHT)
  477 +function Role:refreshPvpMatchH(score, rank)
  478 + self:refreshPvpMatch(score, rank, RANK_PVP_HIGHT)
346 479 end
347 480  
348 481 function Role:getPvpDBKey(ptype)
... ...
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/RoleTimeReset.lua
... ... @@ -17,6 +17,11 @@ ResetFunc[&quot;CrossDay&quot;] = function(self, notify, response, now)
17 17 self:advRandomSupportEffect(not notify)
18 18  
19 19 self:checkExpireItem(not notify)
  20 + local advMine = self:getProperty("advMine")
  21 + if advMine[1] then
  22 + advMine[1].co = nil
  23 + end
  24 + self:setProperty("advMine", advMine)
20 25  
21 26 response.dTask = {}
22 27 response.advSup = self:getProperty("advSup")
... ... @@ -24,10 +29,16 @@ ResetFunc[&quot;CrossDay&quot;] = function(self, notify, response, now)
24 29 end
25 30  
26 31 ResetFunc["CrossWeek"] = function(self, notify, response)
  32 + local advMine = self:getProperty("advMine")
  33 + if advMine[2] then
  34 + advMine[2].co = nil
  35 + end
27 36 self:setProperties({
28 37 wTask = {},
29 38 dinerS = {},
  39 + advMine = advMine,
30 40 })
  41 +
31 42 response.wTask = {}
32 43 response.dinerS = {}
33 44 end
... ...
src/models/Store.lua
... ... @@ -33,6 +33,8 @@ Store.schema = {
33 33 actGoodsFlag = {"table", {}}, -- ActGoodsType 1购买,0未购买
34 34  
35 35 bpInfo = {"table", {}}, -- battle pass 探索指令 1={flag=0 为1表示买了,br=""付费领取记录, fr=""免费领取记录},2,3,4
  36 +
  37 + totalRR = {"string", ""}, -- 累计充值奖励领取记录
36 38 }
37 39  
38 40 function Store:updateProperty(params)
... ... @@ -296,6 +298,8 @@ function Store:resetStoreReored(resetId)
296 298 end
297 299 end
298 300 end
  301 + else
  302 + payRecord[k] = nil
299 303 end
300 304 end
301 305 self:updateProperty({field = "payR", value = payRecord})
... ... @@ -305,6 +309,8 @@ function Store:resetStoreReored(resetId)
305 309 if config.resetTime == resetId then
306 310 buyRecord[k] = nil
307 311 end
  312 + else
  313 + buyRecord[k] = nil
308 314 end
309 315 end
310 316 self:updateProperty({field = "buyR", value = buyRecord})
... ... @@ -386,6 +392,9 @@ function Store:onBuyPaySignCard(dur)
386 392 curTs = getServerOpenTs()
387 393  
388 394 self:SetActGoodsFlag("paySignIn", curTs)
  395 + local actData = self.owner.activity:getActData("PaySignIn")
  396 + actData[0] = 1
  397 + self.owner.activity:updateActData("PaySignIn", actData)
389 398  
390 399 --local actGoodsFlag = self:getProperty("actGoodsFlag") or {}
391 400 --local goodsIndex = GetActGoodsIndex("paySignIn")
... ... @@ -464,6 +473,7 @@ function Store:data()
464 473 --packTrigger = self:getProperty("packTrigger"),
465 474 actGoodsFlag = self:getProperty("actGoodsFlag"),
466 475 bpInfo = self:getProperty("bpInfo"),
  476 + totalRR = self:getProperty("totalRR"),
467 477 }
468 478 end
469 479  
... ...
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
... ... @@ -7,6 +7,7 @@ require &quot;shared.init&quot;
7 7 require "utils.init"
8 8 require "RedisKeys"
9 9 require "skynet.manager"
  10 +require "GlobalVar"
10 11  
11 12  
12 13 local ipairs = ipairs
... ... @@ -16,6 +17,7 @@ local string_format = string.format
16 17  
17 18  
18 19 local CHECK_MAIL_STATUS_INTERVAL = 100 * 60
  20 +local CHECK_BATTLE_ACT_CLOSE_INTERVAL = 100 * 1
19 21 local function mailQuene()
20 22 local delayEmail = tonum(redisproxy:hget("autoincrement_set", "delay_email"))
21 23 if delayEmail == 0 then
... ... @@ -91,6 +93,64 @@ local function check_mail_queue()
91 93 skynet.timeout(CHECK_MAIL_STATUS_INTERVAL, check_mail_queue)
92 94 end
93 95  
  96 +-- @desc: 检测关卡活动结束 排行榜奖励发放
  97 +local lastCheckBattleActTs = 0
  98 +local function check_battle_act_close()
  99 + local csvdb = require "shared.csvdata"
  100 + local act = require "models.Activity"
  101 + local st = 0
  102 + local et = 0
  103 + local actId = 0
  104 + local timeNow = skynet.timex()
  105 + for k, v in pairs(csvdb["activity_ctrlCsv"]) do
  106 + if v.showType == act.ActivityType.ChallengeLevel then
  107 + local openTimes = v.time:toArray(false, "=")
  108 + if openTimes[1] ~= "0" then
  109 + st = toUnixtime(openTimes[1]..string_format("%02x", RESET_TIME))
  110 + end
  111 + if openTimes[2] ~= "0" then
  112 + et = toUnixtime(openTimes[2]..string_format("%02x", RESET_TIME))
  113 + end
  114 + actId = k
  115 + break
  116 + end
  117 + end
  118 + if st ~= 0 and et ~= 0 and actId ~= 0 then
  119 + -- close
  120 + if lastCheckBattleActTs < et and timeNow >= et then
  121 + -- check rank key exist
  122 + local rankKey = RANK_COMMON..RANK_TYPE.ActBattleBoss
  123 + local flag = redisproxy:exists(rankKey)
  124 + if flag then
  125 + local actData = csvdb["activity_groupCsv"][actId]
  126 + local lastRank = actData[#actData].rank
  127 +
  128 + local ids = redisproxy:zrevrange(rankKey, 0 , lastRank - 1)
  129 + local rankIndex = 0
  130 + for roleId in pairs(ids) do
  131 + rankIndex = rankIndex + 1
  132 + for _, cfg in pairs(actData) do
  133 + if rankIndex <= cfg.rank then
  134 + redisproxy:insertEmail({
  135 + roleId = roleId,
  136 + emailId = cfg.email_1,
  137 + attachments = cfg.reward_1,
  138 + contentPms = {rankIndex},
  139 + })
  140 + break
  141 + end
  142 + end
  143 + end
  144 +
  145 + redisproxy:del(rankKey..":bak")
  146 + redisproxy:rename(rankKey, rankKey..":bak")
  147 + end
  148 + end
  149 + end
  150 + lastCheckBattleActTs = skynet.timex()
  151 + skynet.timeout(CHECK_BATTLE_ACT_CLOSE_INTERVAL, check_battle_act_close)
  152 +end
  153 +
94 154  
95 155  
96 156 local CMD = {}
... ... @@ -115,6 +175,7 @@ end
115 175  
116 176 function CMD.start()
117 177 check_mail_queue()
  178 + --check_battle_act_close()
118 179 end
119 180  
120 181 local function __init__()
... ... @@ -129,7 +190,6 @@ local function __init__()
129 190 end
130 191 end
131 192 end)
132   - redisd = skynet.localname(".redis")
133 193 skynet.register(".globald")
134 194  
135 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  
... ...