Commit a18c7fd0cb52b7f64aa85b0e7db0702f3d179e81

Authored by liuzujun
2 parents 606318cb 06c7246e

Merge branch 'cn/develop' into cn/publish/release

* cn/develop:
  按500人分线
  fix: 一番赏 修复广播capsuleId 为空的问题
  fix: 一番赏 修复king赏bug
  fix: 一番赏 特殊赏的抽奖记录的数据结构修改
  fix: 一番赏 打开激励奖导致抽奖逻辑性阻塞的bug
  feat: 一番赏 特殊赏 通知 1. 服务器主动通知 Capsule_notifyChange = 856 2. 客户端主动获获取 Capsule_specialRewardRpc = 857 3. 客户端消除特殊赏通知指令 Capsule_clearSpecialNtyRpc = 862
  fix: 一番赏 优化; 抽奖记录分页;抽扭蛋机,返回值更新
  fix: 一番赏 增加rank,刷新机制完善,修复capsuled 55行报错。
  fix: 一番赏 增加drawEndTime,优化获取奖励剩余数量。
  fix: 一番赏 屏蔽初始化日志
src/ProtocolCode.lua
@@ -281,10 +281,12 @@ actionCodes = { @@ -281,10 +281,12 @@ actionCodes = {
281 Capsule_drawRpc = 854, --抽扭蛋机 281 Capsule_drawRpc = 854, --抽扭蛋机
282 --Capsule_switchRoomRpc = 855, --切换扭蛋机房间 282 --Capsule_switchRoomRpc = 855, --切换扭蛋机房间
283 Capsule_notifyChange = 856, -- 通知信息变动 283 Capsule_notifyChange = 856, -- 通知信息变动
284 - Capsule_payReward = 857, -- 特殊赏 奖励通知 284 + Capsule_specialRewardRpc = 857, -- 获取 未领取特殊赏通知 主动
285 Capsule_exitRpc = 858, -- 退出 285 Capsule_exitRpc = 858, -- 退出
286 Capsule_getDataRpc = 859, --获取扭蛋机信息 286 Capsule_getDataRpc = 859, --获取扭蛋机信息
287 - Capsule_convertCapsuleRpc = 890, --兑换消耗票 287 + Capsule_convertCapsuleRpc = 860, --兑换消耗票
  288 + Capsule_pageRecordRpc = 861, --抽奖记录分页查询
  289 + Capsule_clearSpecialNtyRpc = 862, --消除特殊赏通知
288 } 290 }
289 291
290 rpcResponseBegin = 10000 292 rpcResponseBegin = 10000
src/actions/CapsuleAction.lua
@@ -51,7 +51,7 @@ function _M.joinRpc(agent, data) @@ -51,7 +51,7 @@ function _M.joinRpc(agent, data)
51 if typ == 1 then 51 if typ == 1 then
52 ret = skynet.call(agent.capsule_serv, "lua", "join", roleId, capsuleId) 52 ret = skynet.call(agent.capsule_serv, "lua", "join", roleId, capsuleId)
53 elseif typ == 0 then 53 elseif typ == 0 then
54 - ret = role:joinCapsule() 54 + ret = role:joinCapsule(roleId, capsuleId)
55 end 55 end
56 SendPacket(actionCodes.Capsule_joinRpc, MsgPack.pack(ret)) 56 SendPacket(actionCodes.Capsule_joinRpc, MsgPack.pack(ret))
57 return true 57 return true
@@ -96,7 +96,7 @@ function _M.drawRpc(agent, data) @@ -96,7 +96,7 @@ function _M.drawRpc(agent, data)
96 local full = msg.full or 0-- 0=单次,1=十连抽 2=全收 96 local full = msg.full or 0-- 0=单次,1=十连抽 2=全收
97 local cares = msg.cares 97 local cares = msg.cares
98 98
99 - local ret, token, reward, change, rewardByGoods, capsule 99 + local ret, token, change, drawReward, capsule
100 100
101 --检查库存 101 --检查库存
102 if typ == 1 then 102 if typ == 1 then
@@ -127,26 +127,23 @@ function _M.drawRpc(agent, data) @@ -127,26 +127,23 @@ function _M.drawRpc(agent, data)
127 127
128 --开始抽奖 128 --开始抽奖
129 if typ == 1 then 129 if typ == 1 then
130 - ret, reward, rewardByGoods, capsule = skynet.call(agent.capsule_serv, "lua", "draw_capsule", roleId, capsuleId, full, cares) 130 + ret, drawReward, capsule = skynet.call(agent.capsule_serv, "lua", "draw_capsule", roleId, capsuleId, full, cares)
131 else 131 else
132 - ret, reward, rewardByGoods, capsule= role:drawCapsule(capsuleId, full, cares) 132 + ret, drawReward, capsule = role:drawCapsule(capsuleId, full, cares)
133 end 133 end
134 if ret < 5 then 134 if ret < 5 then
135 return ret 135 return ret
136 end 136 end
137 137
138 - --dump(rewardByGoods)  
139 - --dump(capsule)  
140 -  
141 if ret == 5 then 138 if ret == 5 then
142 - SendPacket(actionCodes.Capsule_drawRpc, MsgPack.pack({change = reward, capsule = capsule})) 139 + SendPacket(actionCodes.Capsule_drawRpc, MsgPack.pack({change = drawReward, capsule = capsule}))
143 return true 140 return true
144 end 141 end
145 142
146 - -- rewardByGoods是抽到的扭蛋信息,reward是抽扭蛋后获得的所有奖励信息。  
147 - if rewardByGoods and next(rewardByGoods) then  
148 - reward, change = role:award(reward, {log = {desc = "CapsuleReward", int1 = tonumber(capsuleId), int2 = roleId}})  
149 - SendPacket(actionCodes.Capsule_drawRpc, MsgPack.pack({reward = rewardByGoods, capsule = capsule})) 143 + if drawReward["reward"] and next(drawReward["reward"]) then
  144 + _, change = role:award(drawReward["reward"], {log = {desc = "CapsuleReward", int1 = tonumber(capsuleId), int2 = roleId}})
  145 + drawReward["capsule"] = capsule
  146 + SendPacket(actionCodes.Capsule_drawRpc, MsgPack.pack(drawReward))
150 else 147 else
151 return ret 148 return ret
152 end 149 end
@@ -164,7 +161,7 @@ function _M.getDataRpc(agent, data) @@ -164,7 +161,7 @@ function _M.getDataRpc(agent, data)
164 if typ == 1 then 161 if typ == 1 then
165 capsule = skynet.call(agent.capsule_serv, "lua", "capsule_data", roleId, capsuleId) 162 capsule = skynet.call(agent.capsule_serv, "lua", "capsule_data", roleId, capsuleId)
166 else 163 else
167 - capsule = role:getCapsuleData(capsuleId) 164 + capsule = role:getCapsuleData(roleId, capsuleId)
168 end 165 end
169 if not capsule then return 1 end 166 if not capsule then return 1 end
170 167
@@ -195,4 +192,61 @@ function _M.convertCapsuleRpc(agent, data) @@ -195,4 +192,61 @@ function _M.convertCapsuleRpc(agent, data)
195 return true 192 return true
196 end 193 end
197 194
  195 +function _M.pageRecordRpc(agent, data)
  196 + local role = agent.role
  197 + local msg = MsgPack.unpack(data)
  198 + local idx = msg.idx
  199 + local up = msg.up or 0
  200 + local capsuleId = msg.capsule_id
  201 + local typ = msg.typ --0=独享,1= 公开
  202 +
  203 + local record
  204 + if typ == 1 then
  205 + record = skynet.call(agent.capsule_serv, "lua", "page_record", capsuleId, up, idx)
  206 + else
  207 + record = role:pageRecord(capsuleId, up, idx)
  208 + end
  209 + if not record then return 1 end
  210 +
  211 + SendPacket(actionCodes.Capsule_pageRecordRpc, MsgPack.pack({record = record}))
  212 + return true
  213 +end
  214 +
  215 +function _M.specialRewardRpc(agent, data)
  216 + local role = agent.role
  217 + local msg = MsgPack.unpack(data)
  218 + local capsuleId = msg.capsule_id
  219 + local typ = msg.typ or 1 --0=独享,1= 公开
  220 + local roleId = role:getProperty("id")
  221 +
  222 + local ret
  223 + if typ == 1 then
  224 + ret = skynet.call(agent.capsule_serv, "lua", "get_special_nty", roleId, capsuleId)
  225 + else
  226 + ret = role:getSpecialNotify(roleId, capsuleId)
  227 + end
  228 + if not ret or not next(ret) then return 1 end
  229 +
  230 + SendPacket(actionCodes.Capsule_specialRewardRpc, MsgPack.pack({special= ret}))
  231 + return true
  232 +end
  233 +
  234 +function _M.clearSpecialNtyRpc(agent, data)
  235 + local role = agent.role
  236 + local msg = MsgPack.unpack(data)
  237 + local capsuleId = msg.capsule_id
  238 + local typ = msg.typ --0=独享,1= 公开
  239 + local good_ids = msg.good_ids
  240 + local roleId = role:getProperty("id")
  241 +
  242 + local ret
  243 + if typ == 1 then
  244 + ret = skynet.call(agent.capsule_serv, "lua", "clear_special_nty", roleId, capsuleId, good_ids)
  245 + end
  246 + if not ret or not next(ret) then return 1 end
  247 +
  248 + SendPacket(actionCodes.Capsule_clearSpecialNtyRpc, MsgPack.pack({}))
  249 + return true
  250 +end
  251 +
198 return _M 252 return _M
199 \ No newline at end of file 253 \ No newline at end of file
src/actions/RoleAction.lua
@@ -288,7 +288,9 @@ function _M.loginRpc( agent, data ) @@ -288,7 +288,9 @@ function _M.loginRpc( agent, data )
288 288
289 -- 注册全服广播 289 -- 注册全服广播
290 if not role._channelIdx then 290 if not role._channelIdx then
291 - local channel = math.randomInt(1, 1) 291 + local online = datacenter.get("onlineCount") or 0
  292 + local channel = math.floor(online / 500) + 1
  293 + --local channel = math.randomInt(1, 1)
292 role._channelIdx = channel 294 role._channelIdx = channel
293 end 295 end
294 if not mcast_util.channel_world() then 296 if not mcast_util.channel_world() then
src/models/Capsule.lua
@@ -44,8 +44,8 @@ Capsule.schema = { @@ -44,8 +44,8 @@ Capsule.schema = {
44 goods = {"table", {}}, --奖励池 44 goods = {"table", {}}, --奖励池
45 specials = {"table", {}}, --特殊赏 45 specials = {"table", {}}, --特殊赏
46 incentive = {"table", {}}, --激励奖 46 incentive = {"table", {}}, --激励奖
47 - incentiveRecord = {"table", {}}, --激励奖记录  
48 - specialsRecord= {"table", {}}, --特殊赏领取记录 47 + incentiveRecord = {"table", {}}, --激励奖记录 {roleId = {}, roleId={}}
  48 + specialsRecord= {"table", {}}, --特殊赏领取记录 {1={},2={}} key=触发特殊赏的 抽奖次数, v=特殊赏商品 table
49 resetTimes = {"number", 0}, --每日一次手动重置的机会 49 resetTimes = {"number", 0}, --每日一次手动重置的机会
50 hideTime = {"number", 0} , --隐藏时间 50 hideTime = {"number", 0} , --隐藏时间
51 drawEndTime = {"number", 0}, --抽完时间 51 drawEndTime = {"number", 0}, --抽完时间
@@ -136,8 +136,6 @@ function Capsule:init() @@ -136,8 +136,6 @@ function Capsule:init()
136 local coin = ichibankuji["token"]:toArray(true, "=") 136 local coin = ichibankuji["token"]:toArray(true, "=")
137 self:setProperties({coin = coin[1] or 0, token = coin, hideTime = ichibankuji.hide_time, goods = goods, specials = specials, incentive = incentive}) 137 self:setProperties({coin = coin[1] or 0, token = coin, hideTime = ichibankuji.hide_time, goods = goods, specials = specials, incentive = incentive})
138 138
139 - skynet.error("初始化完成")  
140 - dump(self:data())  
141 end 139 end
142 140
143 function Capsule:isShow() 141 function Capsule:isShow()
@@ -147,6 +145,56 @@ function Capsule:isShow() @@ -147,6 +145,56 @@ function Capsule:isShow()
147 return true 145 return true
148 end 146 end
149 147
  148 +function Capsule:resetTimeOut(curTime, now)
  149 + now = now or skynet.timex()
  150 + local cur4Time = curTime or (specTime({hour = 4},now))
  151 +
  152 + local interval
  153 + if cur4Time > now then
  154 + interval = cur4Time - now
  155 + elseif cur4Time < now then
  156 + local nextTime = dayLater(now)
  157 + interval = nextTime - now
  158 + elseif cur4Time == now then
  159 + self:init()
  160 + self:create()
  161 +
  162 + local nextTime = dayLater(now)
  163 + interval = nextTime - now
  164 + end
  165 + interval = (interval + 1)* 100
  166 + skynet.timeout(interval, handler(self,self.resetTimeOut))
  167 +end
  168 +
  169 +function Capsule:reset4TimeOut(curTime, now)
  170 + now = now or skynet.timex()
  171 + local interval
  172 + if curTime > now then
  173 + interval = curTime - now
  174 + elseif curTime < now then
  175 + local nextTime = dayLater(now)
  176 + interval = nextTime - now
  177 + elseif curTime == now then
  178 + self:init()
  179 + self:create()
  180 +
  181 + return false
  182 + end
  183 + interval = (interval + 1)* 100
  184 + skynet.timeout(interval, handler(self,self.reset4TimeOut))
  185 +end
  186 +
  187 +function Capsule:checkTime(resetArr, now)
  188 + if resetArr[1] == "3" then
  189 + local cur4Time = specTime({hour = 4},now)
  190 + if now == cur4Time then return true end
  191 + self:resetTimeOut(cur4Time, now)
  192 + elseif resetArr[1] == "4" then
  193 + if now == resetArr[2] then return true end
  194 + self:reset4TimeOut(resetArr[2], now)
  195 + end
  196 +end
  197 +
150 function Capsule:refreshing(now) 198 function Capsule:refreshing(now)
151 local id = self:getProperty("id") 199 local id = self:getProperty("id")
152 local room = self:getProperty("room") 200 local room = self:getProperty("room")
@@ -175,11 +223,10 @@ function Capsule:refreshing(now) @@ -175,11 +223,10 @@ function Capsule:refreshing(now)
175 end 223 end
176 return false 224 return false
177 225
178 - elseif resetArr[1] == "3" then  
179 -  
180 - elseif resetArr[1] == "4" then  
181 - if now >= resetArr[2] then return true end 226 + else
  227 + self:checkTime(resetArr, now)
182 end 228 end
  229 +
183 end 230 end
184 231
185 return false 232 return false
@@ -276,7 +323,7 @@ function Capsule:checkSpecialFlag(typ) @@ -276,7 +323,7 @@ function Capsule:checkSpecialFlag(typ)
276 return spKey, special 323 return spKey, special
277 end 324 end
278 325
279 -local function getSpecialRoleNotify(rewardRecord, count, award, spKey, typ, now) 326 +local function getSpecialReward(rewardRecord, count, award, spKey, typ, now)
280 local rewardByRole = {} 327 local rewardByRole = {}
281 while(count > 0 and next(rewardRecord)) do 328 while(count > 0 and next(rewardRecord)) do
282 local roleId = math.randWeight(rewardRecord, "amount") 329 local roleId = math.randWeight(rewardRecord, "amount")
@@ -287,19 +334,9 @@ local function getSpecialRoleNotify(rewardRecord, count, award, spKey, typ, now) @@ -287,19 +334,9 @@ local function getSpecialRoleNotify(rewardRecord, count, award, spKey, typ, now)
287 334
288 if tmp["amount"] <= 0 then rewardRecord[roleId] = nil end 335 if tmp["amount"] <= 0 then rewardRecord[roleId] = nil end
289 336
290 - tmp = rewardByRole[roleId] or {}  
291 - if not next(tmp) then  
292 - local name = getNameByRoleId(roleId)  
293 - tmp[spKey] = {name = name, good_id = spKey, typ = RewardType.SPECIAL, award = award, amount = 1, quality = typ, create_time= now}  
294 - else  
295 - if not tmp[spKey] then  
296 - local name = getNameByRoleId(roleId)  
297 - tmp[spKey] = {name = name, good_id = spKey, typ = RewardType.SPECIAL, award = award, amount = 1, quality = typ, create_time= now}  
298 - else  
299 - tmp[spKey].amount = tmp[spKey].amount + 1  
300 - end  
301 - end  
302 - rewardByRole[roleId] = tmp 337 + local name = getNameByRoleId(roleId)
  338 + tmp = {name = name, good_id = spKey, typ = RewardType.SPECIAL, award = award, amount = 1, quality = typ, create_time= now}
  339 + table.insert(rewardByRole, tmp)
303 340
304 count = count - 1 341 count = count - 1
305 end 342 end
@@ -308,20 +345,11 @@ local function getSpecialRoleNotify(rewardRecord, count, award, spKey, typ, now) @@ -308,20 +345,11 @@ local function getSpecialRoleNotify(rewardRecord, count, award, spKey, typ, now)
308 end 345 end
309 346
310 347
311 -local rewardToNtyFunc = function(notify, tmpReward)  
312 - for key, val in pairs(tmpReward or {}) do  
313 - if not notify[key] then  
314 - notify[key] = clone(val)  
315 - else  
316 - for k, v in pairs(val) do  
317 - if not notify[key][k] then  
318 - notify[key][k] = v  
319 - else  
320 - notify[key][k] = notify[key][k].amount + v.amount  
321 - end  
322 - end  
323 -  
324 - end 348 +local rewardToRecordFunc = function(specialsRecord, recordAmount, rewardByRole)
  349 + if not specialsRecord[recordAmount] then
  350 + specialsRecord[recordAmount] = rewardByRole
  351 + else
  352 + table.insert(specialsRecord[recordAmount], rewardByRole)
325 end 353 end
326 end 354 end
327 355
@@ -359,12 +387,12 @@ function Capsule:getTop(record, recordAmount,now) @@ -359,12 +387,12 @@ function Capsule:getTop(record, recordAmount,now)
359 end 387 end
360 end 388 end
361 389
362 - local rewardByRole, count = getSpecialRoleNotify(topRecord, special["amount"], special["award"], spKey, SpecialType.TOP,now) 390 + local rewardByRole, count = getSpecialReward(topRecord, special["amount"], special["award"], spKey, SpecialType.TOP,now)
363 391
364 special["amount"] = count 392 special["amount"] = count
365 specials[spKey] = special 393 specials[spKey] = special
366 394
367 - rewardToNtyFunc(specialsRecord, rewardByRole) 395 + rewardToRecordFunc(specialsRecord, recordAmount, rewardByRole)
368 396
369 self:setProperties({specialsRecord = specialsRecord, specials = specials}) 397 self:setProperties({specialsRecord = specialsRecord, specials = specials})
370 return rewardByRole 398 return rewardByRole
@@ -379,14 +407,13 @@ function Capsule:getCore(record, recordAmount,now) @@ -379,14 +407,13 @@ function Capsule:getCore(record, recordAmount,now)
379 local specials = self:getProperty("specials") or {} 407 local specials = self:getProperty("specials") or {}
380 local specialsRecord = self:getProperty("specialsRecord") or {} 408 local specialsRecord = self:getProperty("specialsRecord") or {}
381 409
382 - if self:getGoodsAmount() > 0 then return nil end  
383 410
384 - local np = special["np"]  
385 - if np > recordAmount then return nil end 411 +
  412 + local count = special["np"]
  413 + if count > recordAmount then return nil end
386 414
387 415
388 - local left = math.ceil((np - recordAmount)/2) or 0  
389 - local count = np 416 + local left = math.ceil((count - recordAmount)/2) or 0
390 local roleRecord = {} 417 local roleRecord = {}
391 for i, v in ipairs(record) do 418 for i, v in ipairs(record) do
392 if count <= 0 then break end 419 if count <= 0 then break end
@@ -409,29 +436,26 @@ function Capsule:getCore(record, recordAmount,now) @@ -409,29 +436,26 @@ function Capsule:getCore(record, recordAmount,now)
409 436
410 end 437 end
411 438
412 - local rewardByRole, count = getSpecialRoleNotify(roleRecord, special["amount"], special["award"], spKey, SpecialType.CORE,now) 439 + local rewardByRole, count = getSpecialReward(roleRecord, special["amount"], special["award"], spKey, SpecialType.CORE,now)
413 440
414 special["amount"] = count 441 special["amount"] = count
415 specials[spKey] = special 442 specials[spKey] = special
416 443
417 - rewardToNtyFunc(specialsRecord, rewardByRole) 444 + rewardToRecordFunc(specialsRecord, recordAmount, rewardByRole)
418 self:setProperties({specialsRecord = specialsRecord, specials = specials}) 445 self:setProperties({specialsRecord = specialsRecord, specials = specials})
419 return rewardByRole 446 return rewardByRole
420 end 447 end
421 448
422 -function Capsule:getLast(record,now) 449 +function Capsule:getLast(record, recordAmount, now)
423 local spKey, special = self:checkSpecialFlag(SpecialType.LAST) 450 local spKey, special = self:checkSpecialFlag(SpecialType.LAST)
424 if not special then return nil end 451 if not special then return nil end
425 452
426 local specials = self:getProperty("specials") or {} 453 local specials = self:getProperty("specials") or {}
427 local specialsRecord = self:getProperty("specialsRecord") or {} 454 local specialsRecord = self:getProperty("specialsRecord") or {}
428 455
429 - if self:getGoodsAmount() > 0 then return nil end  
430 -  
431 table.sort(record, function(a, b) return a.create_time > b.create_time end) 456 table.sort(record, function(a, b) return a.create_time > b.create_time end)
432 457
433 - local np = special["np"]  
434 - local count = np 458 + local count = special["np"]
435 local roleRecord = {} 459 local roleRecord = {}
436 for _, v in ipairs(record) do 460 for _, v in ipairs(record) do
437 if count <= 0 then break end 461 if count <= 0 then break end
@@ -452,25 +476,23 @@ function Capsule:getLast(record,now) @@ -452,25 +476,23 @@ function Capsule:getLast(record,now)
452 end 476 end
453 end 477 end
454 478
455 - local rewardByRole, count = getSpecialRoleNotify(roleRecord, special["amount"], special["award"], spKey, SpecialType.LAST,now) 479 + local rewardByRole, count = getSpecialReward(roleRecord, special["amount"], special["award"], spKey, SpecialType.LAST,now)
456 480
457 special["amount"] = count 481 special["amount"] = count
458 specials[spKey] = special 482 specials[spKey] = special
459 483
460 - rewardToNtyFunc(specialsRecord, rewardByRole) 484 + rewardToRecordFunc(specialsRecord, recordAmount, rewardByRole)
461 self:setProperties({specialsRecord = specialsRecord, specials = specials}) 485 self:setProperties({specialsRecord = specialsRecord, specials = specials})
462 return rewardByRole 486 return rewardByRole
463 end 487 end
464 488
465 -function Capsule:getJoker(record,now) 489 +function Capsule:getJoker(record, recordAmount, now)
466 local spKey, special = self:checkSpecialFlag(SpecialType.JOKER) 490 local spKey, special = self:checkSpecialFlag(SpecialType.JOKER)
467 if not special then return nil end 491 if not special then return nil end
468 492
469 local specials = self:getProperty("specials") or {} 493 local specials = self:getProperty("specials") or {}
470 local specialsRecord = self:getProperty("specialsRecord") or {} 494 local specialsRecord = self:getProperty("specialsRecord") or {}
471 495
472 - if self:getGoodsAmount() > 0 then return nil end  
473 -  
474 local roleRecord = {} 496 local roleRecord = {}
475 for _, v in ipairs(record) do 497 for _, v in ipairs(record) do
476 if not roleRecord[v.roleId]then 498 if not roleRecord[v.roleId]then
@@ -480,44 +502,55 @@ function Capsule:getJoker(record,now) @@ -480,44 +502,55 @@ function Capsule:getJoker(record,now)
480 end 502 end
481 end 503 end
482 504
483 - local rewardByRole, count = getSpecialRoleNotify(roleRecord, special["amount"], special["award"], spKey, SpecialType.JOKER,now) 505 + local rewardByRole, count = getSpecialReward(roleRecord, special["amount"], special["award"], spKey, SpecialType.JOKER,now)
484 506
485 special["amount"] = count 507 special["amount"] = count
486 specials[spKey] = special 508 specials[spKey] = special
487 509
488 - rewardToNtyFunc(specialsRecord, rewardByRole) 510 + rewardToRecordFunc(specialsRecord, recordAmount, rewardByRole)
489 self:setProperties({specialsRecord = specialsRecord, specials = specials}) 511 self:setProperties({specialsRecord = specialsRecord, specials = specials})
490 return rewardByRole 512 return rewardByRole
491 end 513 end
492 514
493 -function Capsule:getKing(record,now) 515 +function Capsule:getKing(record, recordAmount, now)
494 local spKey, special = self:checkSpecialFlag(SpecialType.KING) 516 local spKey, special = self:checkSpecialFlag(SpecialType.KING)
495 if not special then return nil end 517 if not special then return nil end
496 518
497 local specials = self:getProperty("specials") or {} 519 local specials = self:getProperty("specials") or {}
498 local specialsRecord = self:getProperty("specialsRecord") or {} 520 local specialsRecord = self:getProperty("specialsRecord") or {}
499 -  
500 - if self:getGoodsAmount() > 0 then return nil end 521 + local rank = self:getProperty("rank") or {}
  522 + if not next(rank) then return nil end
501 523
502 local roleRecord = {} 524 local roleRecord = {}
503 - for _, v in ipairs(record) do  
504 - if not roleRecord[v.roleId]then  
505 - roleRecord[v.roleId] = {amount = v.amount }  
506 - else  
507 - roleRecord[v.roleId] = {amount = (roleRecord[v.roleId]["amount"] or 0) + v.amount}  
508 - end 525 +
  526 + for roleId, count in pairs(rank) do
  527 + table.insert(roleRecord, {roleId = roleId, count = count})
  528 + end
  529 + table.sort(roleRecord, function(a, b) return a.count > b.count end)
  530 +
  531 + local count = math.min(special["amount"], #roleRecord)
  532 +
  533 + local rewardByRole = {}
  534 + local index = 1
  535 + while (count > 0 ) do
  536 + count = count - 1
  537 + local tmp = roleRecord[index]
  538 + if not tmp then break end
  539 + index = index + 1
  540 +
  541 + local name = getNameByRoleId(tmp.roleId)
  542 + table.insert(rewardByRole, {name = name, good_id = spKey, typ = RewardType.SPECIAL, award = special["award"], amount = 1, SpecialType.KING, create_time= now})
509 end 543 end
510 544
511 - local rewardByRole, count = getSpecialRoleNotify(roleRecord, special["amount"], special["award"], spKey, SpecialType.KING,now)  
512 special["amount"] = count 545 special["amount"] = count
513 specials[spKey] = special 546 specials[spKey] = special
514 547
515 - rewardToNtyFunc(specialsRecord, rewardByRole) 548 + rewardToRecordFunc(specialsRecord, recordAmount, rewardByRole)
516 self:setProperties({specialsRecord = specialsRecord, specials = specials}) 549 self:setProperties({specialsRecord = specialsRecord, specials = specials})
517 return rewardByRole 550 return rewardByRole
518 end 551 end
519 552
520 -function Capsule:checkSpecialReward( now) 553 +function Capsule:checkSpecialReward(now, goodsAmount)
521 local specials = self:getProperty("specials") or {} 554 local specials = self:getProperty("specials") or {}
522 if not next(specials) then return nil end 555 if not next(specials) then return nil end
523 local record = self:getProperty("record") or {} 556 local record = self:getProperty("record") or {}
@@ -529,18 +562,19 @@ function Capsule:checkSpecialReward( now) @@ -529,18 +562,19 @@ function Capsule:checkSpecialReward( now)
529 562
530 local notify = self:getTop(record, recordAmount,now) or {} 563 local notify = self:getTop(record, recordAmount,now) or {}
531 564
532 - local coreReward = self:getCore(record, recordAmount, now)  
533 - rewardToNtyFunc(notify, coreReward) 565 + if goodsAmount == 0 then
  566 + local coreReward = self:getCore(record, recordAmount, now)
  567 + rewardToRecordFunc(notify, recordAmount, coreReward)
534 568
535 - local lastReward = self:getLast(record, now)  
536 - rewardToNtyFunc(notify, lastReward) 569 + local lastReward = self:getLast(record, recordAmount, now)
  570 + rewardToRecordFunc(notify, recordAmount, lastReward)
537 571
538 - local jokerReward = self:getJoker(record, now)  
539 - rewardToNtyFunc(notify, jokerReward)  
540 -  
541 - local kingReward = self:getKing(record, now)  
542 - rewardToNtyFunc(notify, kingReward) 572 + local jokerReward = self:getJoker(record, recordAmount, now)
  573 + rewardToRecordFunc(notify, recordAmount, jokerReward)
543 574
  575 + local kingReward = self:getKing(record, recordAmount, now)
  576 + rewardToRecordFunc(notify, recordAmount, kingReward)
  577 + end
544 578
545 return notify 579 return notify
546 end 580 end
@@ -608,12 +642,44 @@ function Capsule:checkIncentive(roleId, name, now) @@ -608,12 +642,44 @@ function Capsule:checkIncentive(roleId, name, now)
608 642
609 end 643 end
610 end 644 end
611 - table.insert(incentiveByRole, notify) 645 + for k, v in pairs(notify) do
  646 + if not incentiveByRole[k] then
  647 + incentiveByRole[k] = v
  648 + else
  649 + incentiveByRole[k].amount = incentiveByRole[k].amount + v.amount
  650 + end
  651 + end
612 incentiveRecord[roleId] = incentiveByRole 652 incentiveRecord[roleId] = incentiveByRole
613 self:setProperty("incentiveRecord", incentiveRecord) 653 self:setProperty("incentiveRecord", incentiveRecord)
614 654
615 - --TODO 先屏蔽  
616 - return {} 655 + return incentiveByRole
  656 +end
  657 +
  658 +local rewardCollect = function(reward, goods)
  659 + for _, v in pairs(goods) do
  660 + for id, count in pairs(v.award:toNumMap()) do
  661 + reward[id] = (reward[id] or 0) + count * v.amount
  662 + end
  663 + end
  664 +end
  665 +
  666 +local rewardCollectByRoleId = function(roleId, reward, goods)
  667 + local tmp = {}
  668 + for _, val in pairs(goods) do
  669 + for _, v in ipairs(val) do
  670 + if v.roleId == roleId then
  671 + for id, count in pairs(v.award:toNumMap()) do
  672 + reward[id] = (reward[id] or 0) + count * v.amount
  673 + end
  674 + if not tmp[v.good_id] then
  675 + tmp[v.good_id] = v
  676 + else
  677 + tmp[v.good_id].amount = tmp[v.good_id].amount + v.amount
  678 + end
  679 + end
  680 + end
  681 + end
  682 + return tmp
617 end 683 end
618 684
619 function Capsule:drawByCount(roleId, count) 685 function Capsule:drawByCount(roleId, count)
@@ -621,6 +687,8 @@ function Capsule:drawByCount(roleId, count) @@ -621,6 +687,8 @@ function Capsule:drawByCount(roleId, count)
621 687
622 local goods = self:getProperty("goods") or {} 688 local goods = self:getProperty("goods") or {}
623 local record = self:getProperty("record") or {} 689 local record = self:getProperty("record") or {}
  690 + local rank = self:getProperty("rank") or {}
  691 + local rankRole = rank[roleId] or 0
624 local recordByRole = self:getProperty("recordByRole") or {} 692 local recordByRole = self:getProperty("recordByRole") or {}
625 local roleRecord = recordByRole[roleId] or {} 693 local roleRecord = recordByRole[roleId] or {}
626 694
@@ -630,9 +698,8 @@ function Capsule:drawByCount(roleId, count) @@ -630,9 +698,8 @@ function Capsule:drawByCount(roleId, count)
630 local goods_id = ichibankuji["goods_id"] 698 local goods_id = ichibankuji["goods_id"]
631 local now = skynet.timex() 699 local now = skynet.timex()
632 700
633 - --奖励, 通知信息  
634 - local notify= {}  
635 - notify[roleId] = {} 701 + --奖励,普通奖品信息
  702 + local goodsByUsual= {}
636 703
637 local name = getNameByRoleId(roleId) 704 local name = getNameByRoleId(roleId)
638 while (goods and next(goods) and count > 0) do 705 while (goods and next(goods) and count > 0) do
@@ -643,15 +710,18 @@ function Capsule:drawByCount(roleId, count) @@ -643,15 +710,18 @@ function Capsule:drawByCount(roleId, count)
643 if good and good.amount > 0 then 710 if good and good.amount > 0 then
644 good.amount = good.amount - 1 711 good.amount = good.amount - 1
645 712
  713 + --插入rank
  714 + rankRole = rankRole + 1
  715 +
646 --插入记录 716 --插入记录
647 local tmpNotify = {roleId = roleId, name= name, good_id = good_id, typ = RewardType.GOODS, award = good.award, amount = 1, quality = good.quality, create_time= now} 717 local tmpNotify = {roleId = roleId, name= name, good_id = good_id, typ = RewardType.GOODS, award = good.award, amount = 1, quality = good.quality, create_time= now}
648 table.insert(record, tmpNotify) 718 table.insert(record, tmpNotify)
649 719
650 --作为奖励记录+通知 720 --作为奖励记录+通知
651 - if not notify[roleId][good_id] then  
652 - notify[roleId][good_id] = tmpNotify 721 + if not goodsByUsual[good_id] then
  722 + goodsByUsual[good_id] = tmpNotify
653 else 723 else
654 - notify[roleId][good_id].amount = notify[roleId][good_id].amount + 1 724 + goodsByUsual[good_id].amount = goodsByUsual[good_id].amount + 1
655 end 725 end
656 726
657 --记录角色的抽奖记录 计算激励奖需要用到 727 --记录角色的抽奖记录 计算激励奖需要用到
@@ -666,48 +736,46 @@ function Capsule:drawByCount(roleId, count) @@ -666,48 +736,46 @@ function Capsule:drawByCount(roleId, count)
666 end 736 end
667 737
668 end 738 end
  739 +
  740 + --奖励池重新赋值
  741 + rank[roleId] = rankRole
669 recordByRole[roleId] = roleRecord 742 recordByRole[roleId] = roleRecord
670 - self:setProperties({recordByRole = recordByRole, record = record, goods = goods}) 743 + self:setProperties({recordByRole = recordByRole, record = record, goods = goods, rank = rank})
671 744
672 - local tmpNotify = self:checkIncentive(roleId, name, now)  
673 - for k, v in pairs(tmpNotify) do  
674 - if not notify[roleId][k] then  
675 - notify[roleId][k] = v  
676 - else  
677 - notify[roleId][k].amount = notify[roleId][k].amount + v.amount  
678 - end  
679 - end 745 + --奖励收集
  746 + local reward = {}
  747 + rewardCollect(reward, goodsByUsual)
680 748
681 - local speciNotify = self:checkSpecialReward(now)  
682 - rewardToNtyFunc(notify, speciNotify)  
683 -  
684 - local reward, rewardByGoods = {}, {}  
685 - for key, val in pairs(notify) do  
686 - if key == roleId then  
687 - for k, v in pairs(val) do  
688 - for id, count in pairs(v.award:toNumMap()) do  
689 - reward[id] = (reward[id] or 0) + count  
690 - end  
691 - rewardByGoods[k] = v  
692 - end  
693 - end 749 + local goodsByIncentive = self:checkIncentive(roleId, name, now)
  750 + rewardCollect(reward, goodsByIncentive)
694 751
  752 + local goodsAmount = self:getGoodsAmount()
  753 + if goodsAmount == 0 then
  754 + self:setProperty("drawEndTime", now)
695 end 755 end
696 - return reward, rewardByGoods, notify 756 +
  757 + local goodsBySpecial = self:checkSpecialReward(now, goodsAmount)
  758 + local specialByRole = rewardCollectByRoleId(roleId, reward, goodsBySpecial)
  759 +
  760 + return {reward = reward, usual = goodsByUsual, incentive = goodsByIncentive, specials = goodsBySpecial, special = specialByRole}
697 end 761 end
698 762
699 function Capsule:drawAll(roleId) 763 function Capsule:drawAll(roleId)
700 local goods = self:getProperty("goods") or {} 764 local goods = self:getProperty("goods") or {}
701 local record = self:getProperty("record") or {} 765 local record = self:getProperty("record") or {}
  766 + local rank = self:getProperty("rank") or {}
  767 + local rankRole = rank[roleId] or 0
702 local recordByRole = self:getProperty("recordByRole") or {} 768 local recordByRole = self:getProperty("recordByRole") or {}
703 local roleRecord = recordByRole[roleId] or {} 769 local roleRecord = recordByRole[roleId] or {}
704 local now = skynet.timex() 770 local now = skynet.timex()
705 771
706 local name = getNameByRoleId(roleId) 772 local name = getNameByRoleId(roleId)
707 - local notify = {}  
708 - notify[roleId] = {} 773 + local goodsByUsual = {}
709 for good_id, good in pairs(goods) do 774 for good_id, good in pairs(goods) do
710 if good.amount > 0 then 775 if good.amount > 0 then
  776 + --插入rank
  777 + rankRole = rankRole + good.amount
  778 +
711 --插入记录 779 --插入记录
712 local tmpNotify = {roleId = roleId, name= name, good_id = good_id, typ = RewardType.GOODS, award = good.award, amount = good.amount, quality = good.quality, create_time = now} 780 local tmpNotify = {roleId = roleId, name= name, good_id = good_id, typ = RewardType.GOODS, award = good.award, amount = good.amount, quality = good.quality, create_time = now}
713 for i = 1, good.amount do 781 for i = 1, good.amount do
@@ -715,10 +783,10 @@ function Capsule:drawAll(roleId) @@ -715,10 +783,10 @@ function Capsule:drawAll(roleId)
715 end 783 end
716 784
717 --作为奖励记录+通知 785 --作为奖励记录+通知
718 - if not notify[roleId][good_id] then  
719 - notify[roleId][good_id] = tmpNotify 786 + if not goodsByUsual[good_id] then
  787 + goodsByUsual[good_id] = tmpNotify
720 else 788 else
721 - notify[roleId][good_id].amount = notify[roleId][good_id].amount + good.award 789 + goodsByUsual[good_id].amount = goodsByUsual[good_id].amount + good.award
722 end 790 end
723 791
724 --记录角色的抽奖记录 792 --记录角色的抽奖记录
@@ -732,34 +800,26 @@ function Capsule:drawAll(roleId) @@ -732,34 +800,26 @@ function Capsule:drawAll(roleId)
732 end 800 end
733 801
734 end 802 end
  803 + rank[roleId] = rankRole
735 recordByRole[roleId] = roleRecord 804 recordByRole[roleId] = roleRecord
736 - self:setProperties({recordByRole = recordByRole, record = record, goods = goods}) 805 + self:setProperties({recordByRole = recordByRole, record = record, goods = goods, rank = rank})
737 806
738 - local tmpNotify = self:checkIncentive(roleId, name, now)  
739 - for k, v in pairs(tmpNotify) do  
740 - if not notify[roleId][k] then  
741 - notify[roleId][k] = v  
742 - else  
743 - notify[roleId][k].amount = notify[roleId][k].amount + v.amount  
744 - end  
745 - end  
746 -  
747 - local speciNotify = self:checkSpecialReward(now)  
748 - rewardToNtyFunc(notify, speciNotify) 807 + --奖励收集
  808 + local reward = {}
  809 + rewardCollect(reward, goodsByUsual)
749 810
750 - local reward, rewardByGoods = {}, {}  
751 - for key, val in pairs(notify) do  
752 - if key == roleId then  
753 - for k, v in pairs(val) do  
754 - for id, count in pairs(v.award:toNumMap()) do  
755 - reward[id] = (reward[id] or 0) + count  
756 - end  
757 - rewardByGoods[k] = v  
758 - end  
759 - end 811 + local goodsByIncentive = self:checkIncentive(roleId, name, now)
  812 + rewardCollect(reward, goodsByIncentive)
760 813
  814 + local goodsAmount = self:getGoodsAmount()
  815 + if goodsAmount == 0 then
  816 + self:setProperty("drawEndTime", now)
761 end 817 end
762 - return reward, rewardByGoods, notify 818 +
  819 + local goodsBySpecial = self:checkSpecialReward(now, goodsAmount)
  820 + local specialByRole = rewardCollectByRoleId(roleId, reward, goodsBySpecial)
  821 +
  822 + return {reward = reward, usual = goodsByUsual, incentive = goodsByIncentive, specials = goodsBySpecial, special = specialByRole}
763 end 823 end
764 824
765 --@param 825 --@param
@@ -790,6 +850,65 @@ function Capsule:draw(roleId, full, cares) @@ -790,6 +850,65 @@ function Capsule:draw(roleId, full, cares)
790 end 850 end
791 end 851 end
792 852
  853 +function Capsule:pageRecord(up, idx)
  854 + local record = self:getProperty("record") or {}
  855 + if not next(record) then return nil end
  856 +
  857 + --默认取20条
  858 + idx = idx or #record
  859 + up = up or 0
  860 +
  861 + local count = 0
  862 + local tmpRecord = {}
  863 + if up == 1 then
  864 + --向上获取索引更大的 从上往下拉
  865 + count = math.min(#record - idx, 20)
  866 + for i = idx, count do
  867 + tmpRecord[i] = record[i]
  868 + end
  869 + else
  870 + --向下获取索引更小的 从下往上拉
  871 + count = math.max(idx - 20, 0)
  872 + for i = count, idx do
  873 + tmpRecord[i] = record[i]
  874 + end
  875 + end
  876 +
  877 + return tmpRecord
  878 +end
  879 +
  880 +--检查是否有未领取奖励的通知
  881 +function Capsule:getSpecialNotify(roleId)
  882 + local specialsRecord = self:getProperty("specialsRecord") or {}
  883 + local tmp = {}
  884 + for _, goods in pairs(specialsRecord) do
  885 + for _, good in ipairs(goods) do
  886 + if good.roleId == roleId then
  887 + if not good.nty or good.nty == 0 then
  888 + tmp[good.good_id] = good
  889 + end
  890 + end
  891 + end
  892 + end
  893 + self:setProperty("specialsRecord", specialsRecord)
  894 +
  895 + return tmp
  896 +end
  897 +
  898 +function Capsule:clearSpecialNty(roleId, good_ids)
  899 + local specialsRecord = self:getProperty("specialsRecord") or {}
  900 + for _, goods in pairs(specialsRecord) do
  901 + for _, good in ipairs(goods) do
  902 + for _, good_id in ipairs(good_ids) do
  903 + if good_id == good.good_id and good.roleId == roleId then
  904 + good.nty = 1
  905 + end
  906 + end
  907 + end
  908 + end
  909 + self:setProperty("specialsRecord", specialsRecord)
  910 +end
  911 +
793 912
794 function Capsule:data(roleId) 913 function Capsule:data(roleId)
795 return { 914 return {
@@ -800,7 +919,7 @@ function Capsule:data(roleId) @@ -800,7 +919,7 @@ function Capsule:data(roleId)
800 coin = self:getProperty("coin"), 919 coin = self:getProperty("coin"),
801 onlineCount = self:getOnlineCount(), 920 onlineCount = self:getOnlineCount(),
802 playerStatus = self:getRegisterByRoleId(roleId), 921 playerStatus = self:getRegisterByRoleId(roleId),
803 - record = self:getProperty("record"), 922 + record = self:pageRecord() or {},
804 rank = self:getProperty("rank"), 923 rank = self:getProperty("rank"),
805 goods = self:getProperty("goods"), 924 goods = self:getProperty("goods"),
806 specials = self:getProperty("specials"), 925 specials = self:getProperty("specials"),
src/models/RoleCross.lua
@@ -211,7 +211,6 @@ RoleCross.bind = function (Role) @@ -211,7 +211,6 @@ RoleCross.bind = function (Role)
211 end 211 end
212 212
213 function Role:paySpecialReward(roleId, notify) 213 function Role:paySpecialReward(roleId, notify)
214 - dump(notify)  
215 if notify and next(notify) then 214 if notify and next(notify) then
216 local reward = {} 215 local reward = {}
217 for key, val in pairs(notify) do 216 for key, val in pairs(notify) do
@@ -221,6 +220,7 @@ RoleCross.bind = function (Role) @@ -221,6 +220,7 @@ RoleCross.bind = function (Role)
221 220
222 end 221 end
223 self:award(reward, {log = {desc = "CapsuleReward", int1=roleId}}) 222 self:award(reward, {log = {desc = "CapsuleReward", int1=roleId}})
  223 + SendPacket(actionCodes.Capsule_notifyChange, MsgPack.pack({special = notify}))
224 end 224 end
225 end 225 end
226 226
src/models/RolePlugin.lua
@@ -2090,7 +2090,7 @@ function RolePlugin.bind(Role) @@ -2090,7 +2090,7 @@ function RolePlugin.bind(Role)
2090 local emailSync = math.max(emailSync + 1, globalEmail - EMAIL_LIMIT + 1) 2090 local emailSync = math.max(emailSync + 1, globalEmail - EMAIL_LIMIT + 1)
2091 local redret = redisproxy:pipelining(function (red) 2091 local redret = redisproxy:pipelining(function (red)
2092 for id = emailSync, globalEmail do 2092 for id = emailSync, globalEmail do
2093 - red:hgetall(string.format("globalEmail:%s", id)) 2093 + red:hgetall(string.format("globalEmail:%s", id))
2094 end 2094 end
2095 end) 2095 end)
2096 for _, data in ipairs(redret) do 2096 for _, data in ipairs(redret) do
@@ -3165,17 +3165,20 @@ function RolePlugin.bind(Role) @@ -3165,17 +3165,20 @@ function RolePlugin.bind(Role)
3165 end 3165 end
3166 3166
3167 function Role:drawCapsule(capsuleId, full, cares) 3167 function Role:drawCapsule(capsuleId, full, cares)
3168 - local capsule = self.capsules[capsuleId] or {}  
3169 - if next(capsule) then  
3170 - local roleId = self:getProperty("id")  
3171 - return capsule:draw(roleId, full, cares)  
3172 - end  
3173 - return 3 3168 + local capsule = self.capsules[capsuleId]
  3169 + if not capsule then return nil end
  3170 +
  3171 + local roleId = self:getProperty("id")
  3172 + local ret, drawReward = capsule:draw(roleId, full, cares)
  3173 + drawReward["specials"] = nil
  3174 + return ret, drawReward, capsule:data(roleId)
3174 end 3175 end
3175 3176
3176 - function Role:joinCapsule(capsuleId)  
3177 - local capsule = self.capsules[capsuleId] or {}  
3178 - return capsule:data() 3177 + function Role:joinCapsule(roleId, capsuleId)
  3178 + local capsule = self.capsules[capsuleId]
  3179 + if not capsule then return nil end
  3180 +
  3181 + return capsule:data(roleId)
3179 end 3182 end
3180 3183
3181 function Role:checkCapsule(now) 3184 function Role:checkCapsule(now)
@@ -3188,13 +3191,17 @@ function RolePlugin.bind(Role) @@ -3188,13 +3191,17 @@ function RolePlugin.bind(Role)
3188 end 3191 end
3189 3192
3190 function Role:goodStock(capsuleId) 3193 function Role:goodStock(capsuleId)
3191 - local capsule = self.capsules[capsuleId] or {} 3194 + local capsule = self.capsules[capsuleId]
  3195 + if not capsule then return 0 end
  3196 +
3192 return capsule:getGoodsAmount(), capsule:getProperty("token") 3197 return capsule:getGoodsAmount(), capsule:getProperty("token")
3193 end 3198 end
3194 3199
3195 - function Role:getCapsuleData(capsuleId)  
3196 - local capsule = self.capsules[capsuleId] or {}  
3197 - return capsule:data() 3200 + function Role:getCapsuleData(roleId, capsuleId)
  3201 + local capsule = self.capsules[capsuleId]
  3202 + if not capsule then return nil end
  3203 +
  3204 + return capsule:data(roleId)
3198 end 3205 end
3199 3206
3200 function Role:resetCapsule() 3207 function Role:resetCapsule()
@@ -3220,6 +3227,20 @@ function RolePlugin.bind(Role) @@ -3220,6 +3227,20 @@ function RolePlugin.bind(Role)
3220 end 3227 end
3221 end 3228 end
3222 end 3229 end
  3230 +
  3231 + function Role:pageRecord(capsuleId, up, idx)
  3232 + local capsule = self.capsules[capsuleId]
  3233 + if not capsule then return nil end
  3234 +
  3235 + return capsule:pageRecord(up, idx)
  3236 + end
  3237 +
  3238 + function Role:getSpecialNotify(roleId, capsuleId)
  3239 + local capsule = self.capsules[capsuleId]
  3240 + if not capsule then return nil end
  3241 +
  3242 + return capsule:getSpecialNotify(roleId)
  3243 + end
3223 end 3244 end
3224 3245
3225 return RolePlugin 3246 return RolePlugin
3226 \ No newline at end of file 3247 \ No newline at end of file
src/services/agent_ctrl.lua
@@ -141,10 +141,11 @@ function _M:check_agent_status() @@ -141,10 +141,11 @@ function _M:check_agent_status()
141 end 141 end
142 end 142 end
143 143
  144 + datacenter.set("onlineCount", count)
144 if now >= next_log_time and now % 60 == 0 then 145 if now >= next_log_time and now % 60 == 0 then
145 next_log_time = now + 60 146 next_log_time = now + 60
146 local count = table_nums(self.u2f) 147 local count = table_nums(self.u2f)
147 - datacenter.set("onlineCount", count) 148 + --datacenter.set("onlineCount", count)
148 logproxy:log({["@type"] = "online", count = count}, "log") 149 logproxy:log({["@type"] = "online", count = count}, "log")
149 end 150 end
150 end 151 end
src/services/capsuled.lua
@@ -51,7 +51,9 @@ function getNameByRoleId(roleId) @@ -51,7 +51,9 @@ function getNameByRoleId(roleId)
51 end 51 end
52 52
53 function broadCastCapsule(roleId, capsuleId, broadInfo) 53 function broadCastCapsule(roleId, capsuleId, broadInfo)
54 - local capsule = capsules[capsuleId] or {} 54 + local capsule = capsules[capsuleId]
  55 + if not capsule then print("not capsule :" .. capsuleId) return end
  56 +
55 local register = capsule:getProperty("register") or {} 57 local register = capsule:getProperty("register") or {}
56 if next(capsule) then 58 if next(capsule) then
57 for id, _ in pairs(register) do 59 for id, _ in pairs(register) do
@@ -63,21 +65,23 @@ function broadCastCapsule(roleId, capsuleId, broadInfo) @@ -63,21 +65,23 @@ function broadCastCapsule(roleId, capsuleId, broadInfo)
63 end 65 end
64 66
65 function broadCastSpecial(roleId, capsuleId, broadInfo) 67 function broadCastSpecial(roleId, capsuleId, broadInfo)
66 - local capsule = capsules[capsuleId] or {} 68 + if not broadInfo or not next(broadInfo) then return end
  69 + local capsule = capsules[capsuleId]
  70 + if not capsule then skynet.error("not capsule: " .. capsuleId) return end
  71 +
67 local register = capsule:getProperty("register") or {} 72 local register = capsule:getProperty("register") or {}
68 - if next(capsule) then  
69 - for id, _ in pairs(register) do  
70 - if id ~= roleId then  
71 - if broadInfo[id] then  
72 - rpcRole(id, "paySpecialReward", id, broadInfo[id])  
73 - end 73 + for id, _ in pairs(register) do
  74 + if id ~= roleId then
  75 + if broadInfo[id] then
  76 + rpcRole(id, "paySpecialReward", id, broadInfo[id])
74 end 77 end
75 end 78 end
76 end 79 end
77 end 80 end
78 81
79 local function add(roleId, capsuleId) 82 local function add(roleId, capsuleId)
80 - local capsule = capsules[capsuleId] or {} 83 + local capsule = capsules[capsuleId]
  84 + if not capsule then skynet.error("not capsule: " .. capsuleId) return end
81 if next(capsule) then 85 if next(capsule) then
82 capsule:join(roleId) 86 capsule:join(roleId)
83 broadCastCapsule(roleId, capsuleId, {notifyType= NotifyChangeType.JOIN, roleId = roleId}) 87 broadCastCapsule(roleId, capsuleId, {notifyType= NotifyChangeType.JOIN, roleId = roleId})
@@ -88,8 +92,9 @@ local function add(roleId, capsuleId) @@ -88,8 +92,9 @@ local function add(roleId, capsuleId)
88 end 92 end
89 93
90 local function capsuleRefreshing() 94 local function capsuleRefreshing()
  95 + local now = skynet.timex()
91 for _, v in pairs(capsules) do 96 for _, v in pairs(capsules) do
92 - if v:refreshing() then 97 + if v:refreshing(now) then
93 v:init() 98 v:init()
94 v:create() 99 v:create()
95 end 100 end
@@ -114,13 +119,11 @@ function CMD.reset() @@ -114,13 +119,11 @@ function CMD.reset()
114 for _, val in ipairs(data) do 119 for _, val in ipairs(data) do
115 if val.type == 1 then 120 if val.type == 1 then
116 local key = val.id..val.room 121 local key = val.id..val.room
117 - if not capsules[key] then  
118 - local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key), id= val.id, room = val.room, typ = 1, name=val.name})  
119 - capsule:init()  
120 - capsule:create()  
121 - capsules[key] = capsule  
122 - redisproxy:sadd(CAPSULE_INFO, key)  
123 - end 122 + local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key), id= val.id, room = val.room, typ = 1, name=val.name})
  123 + capsule:init()
  124 + capsule:create()
  125 + capsules[key] = capsule
  126 + redisproxy:sadd(CAPSULE_INFO, key)
124 end 127 end
125 end 128 end
126 end 129 end
@@ -149,11 +152,14 @@ function CMD.start() @@ -149,11 +152,14 @@ function CMD.start()
149 if val.type == 1 then 152 if val.type == 1 then
150 local key = val.id..val.room 153 local key = val.id..val.room
151 if not capsules[key] then 154 if not capsules[key] then
152 - local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key), id= val.id, room = val.room, typ = 1, name=val.name})  
153 - capsule:init()  
154 - capsule:create()  
155 - capsules[key] = capsule  
156 - redisproxy:sadd(CAPSULE_INFO, key) 155 + if now < val.hide_time then
  156 + local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key), id= val.id, room = val.room, typ = 1, name=val.name})
  157 + capsule:init()
  158 + capsule:create()
  159 +
  160 + capsules[key] = capsule
  161 + redisproxy:sadd(CAPSULE_INFO, key)
  162 + end
157 end 163 end
158 end 164 end
159 end 165 end
@@ -183,49 +189,76 @@ end @@ -183,49 +189,76 @@ end
183 189
184 function CMD.exit(roleId, capsuleId) 190 function CMD.exit(roleId, capsuleId)
185 if capsuleId then 191 if capsuleId then
186 - local capsule = capsules[capsuleId] or {}  
187 - if next(capsule) then  
188 - capsule:exit(roleId)  
189 - broadCastCapsule(roleId, capsuleId, {notifyType = NotifyChangeType.EXIT, roleId = roleId})  
190 - end 192 + local capsule = capsules[capsuleId]
  193 + if not capsule then skynet.error("not capsule: " .. capsuleId) return end
  194 +
  195 + capsule:exit(roleId)
  196 + broadCastCapsule(roleId, capsuleId, {notifyType = NotifyChangeType.EXIT, roleId = roleId})
191 else 197 else
192 - for _, capsule in pairs(capsules) do 198 + for id, capsule in pairs(capsules) do
193 if next(capsule) then 199 if next(capsule) then
194 capsule:exit(roleId) 200 capsule:exit(roleId)
195 - broadCastCapsule(roleId, capsuleId, {notifyType = NotifyChangeType.EXIT, roleId = roleId}) 201 + broadCastCapsule(roleId, id, {notifyType = NotifyChangeType.EXIT, roleId = roleId})
196 end 202 end
197 end 203 end
198 end 204 end
199 end 205 end
200 206
201 function CMD.draw_capsule(roleId, capsuleId, full, drawsNum, cares) 207 function CMD.draw_capsule(roleId, capsuleId, full, drawsNum, cares)
202 - local capsule = capsules[capsuleId] or {}  
203 - if next(capsule) then  
204 - local ret, reward, rewardByGoods, notify = capsule:draw(roleId, full, drawsNum, cares)  
205 - if ret > 5 then  
206 - --broadCastCapsule(roleId, capsuleId, {notifyType = NotifyChangeType.DRAW, notify = notify})  
207 - broadCastSpecial(roleId, capsuleId, notify)  
208 - end  
209 - return ret, reward, rewardByGoods, capsule:data(roleId) 208 + local capsule = capsules[capsuleId]
  209 + if not capsule then skynet.error("not capsule: " .. capsuleId) return 2 end
  210 +
  211 + local ret, drawReward = capsule:draw(roleId, full, drawsNum, cares)
  212 + if ret > 5 then
  213 + --broadCastCapsule(roleId, capsuleId, {notifyType = NotifyChangeType.DRAW, notify = notify})
  214 + broadCastSpecial(roleId, capsuleId, drawReward["specials"])
210 end 215 end
211 - return 2 216 + drawReward["specials"] = nil
  217 + return ret, drawReward, capsule:data(roleId)
212 end 218 end
213 219
214 function CMD.register(roleId, capsuleId) 220 function CMD.register(roleId, capsuleId)
215 - local capsule = capsules[capsuleId] or {} 221 + local capsule = capsules[capsuleId]
  222 + if not capsule then skynet.error("not capsule: " .. capsuleId) return nil end
  223 +
216 return capsule:register(roleId) 224 return capsule:register(roleId)
217 end 225 end
218 226
219 function CMD.goods_stock(capsuleId) 227 function CMD.goods_stock(capsuleId)
220 - local capsule = capsules[capsuleId] or {} 228 + local capsule = capsules[capsuleId]
  229 + if not capsule then skynet.error("not capsule: " .. capsuleId) return 0 end
  230 +
221 return capsule:getGoodsAmount(), capsule:getProperty("token") 231 return capsule:getGoodsAmount(), capsule:getProperty("token")
222 end 232 end
223 233
224 function CMD.capsule_data(roleId, capsuleId) 234 function CMD.capsule_data(roleId, capsuleId)
225 - local capsule = capsules[capsuleId] or {} 235 + local capsule = capsules[capsuleId]
  236 + if not capsule then skynet.error("not capsule: " .. capsuleId) return nil end
  237 +
226 return capsule:data(roleId) 238 return capsule:data(roleId)
227 end 239 end
228 240
  241 +function CMD.page_record(capsuleId, up, idx)
  242 + local capsule = capsules[capsuleId]
  243 + if not capsule then skynet.error("not capsule: " .. capsuleId) return nil end
  244 +
  245 + return capsule:pageRecord(up, idx)
  246 +end
  247 +
  248 +function CMD.get_special_nty(roleId, capsuleId)
  249 + local capsule = capsules[capsuleId]
  250 + if not capsule then skynet.error("not capsule: " .. capsuleId) return nil end
  251 +
  252 + return capsule:getSpecialNotify(roleId)
  253 +end
  254 +
  255 +function CMD.clear_special_nty(roleId, capsuleId, good_ids)
  256 + local capsule = capsules[capsuleId]
  257 + if not capsule then skynet.error("not capsule: " .. capsuleId) return nil end
  258 +
  259 + return capsule:clearSpecialNty(roleId, good_ids)
  260 +end
  261 +
229 skynet.start(function() 262 skynet.start(function()
230 skynet.dispatch("lua", function(session, address, cmd, ...) 263 skynet.dispatch("lua", function(session, address, cmd, ...)
231 local f = CMD[string.lower(cmd)] 264 local f = CMD[string.lower(cmd)]
src/services/watchdog.lua
@@ -56,7 +56,7 @@ end @@ -56,7 +56,7 @@ end
56 56
57 -- 创建world以及union channel 用于广播 57 -- 创建world以及union channel 用于广播
58 function create_mutilcast() 58 function create_mutilcast()
59 - for i = 1, 10 do 59 + for i = 1, 50 do
60 local chan_w = mc:new() 60 local chan_w = mc:new()
61 datacenter.set("MC_W_CHANNEL" .. i, chan_w.channel) 61 datacenter.set("MC_W_CHANNEL" .. i, chan_w.channel)
62 end 62 end