Commit 598357652e20e82a14325183b6d22e2c989a896c
1 parent
03a6166a
排行榜
Showing
11 changed files
with
233 additions
and
19 deletions
Show diff stats
src/GlobalVar.lua
src/ProtocolCode.lua
| @@ -90,12 +90,14 @@ actionCodes = { | @@ -90,12 +90,14 @@ actionCodes = { | ||
| 90 | Diner_addWantFoodRpc = 312, | 90 | Diner_addWantFoodRpc = 312, |
| 91 | Diner_initTaskRpc = 313, | 91 | Diner_initTaskRpc = 313, |
| 92 | Diner_handleTaskRpc = 314, | 92 | Diner_handleTaskRpc = 314, |
| 93 | + Diner_rankRpc = 315, | ||
| 93 | 94 | ||
| 94 | Tower_roleFormatRpc = 350, | 95 | Tower_roleFormatRpc = 350, |
| 95 | Tower_startBattleRpc = 351, | 96 | Tower_startBattleRpc = 351, |
| 96 | Tower_endBattleRpc = 352, | 97 | Tower_endBattleRpc = 352, |
| 97 | Tower_rankRpc = 353, | 98 | Tower_rankRpc = 353, |
| 98 | Tower_bugCountRpc = 354, | 99 | Tower_bugCountRpc = 354, |
| 100 | + Tower_rankInfoRpc = 355, | ||
| 99 | 101 | ||
| 100 | Car_makePotionRpc = 400, | 102 | Car_makePotionRpc = 400, |
| 101 | Car_equipUpRpc = 401, | 103 | Car_equipUpRpc = 401, |
src/RedisKeys.lua
| @@ -8,6 +8,13 @@ R_EQUIP_ROOT = "role:%d:equip*" -- 装备根目录 | @@ -8,6 +8,13 @@ R_EQUIP_ROOT = "role:%d:equip*" -- 装备根目录 | ||
| 8 | R_RUNEIDS = "role:%d:runeIds" -- 玩家拥有符文自增id | 8 | R_RUNEIDS = "role:%d:runeIds" -- 玩家拥有符文自增id |
| 9 | R_RUNE = "role:%d:rune:%d" -- 符文详细信息 | 9 | R_RUNE = "role:%d:rune:%d" -- 符文详细信息 |
| 10 | 10 | ||
| 11 | + | ||
| 12 | +-- rank | ||
| 13 | +RANK_TOWER = "rank:tower" | ||
| 14 | +RANK_TOWER_INFO = "rank:tower:info" | ||
| 15 | + | ||
| 16 | +RANK_DINER = {"rank:diner1", "rank:diner2"} -- 餐厅排行榜 两个每天互换 | ||
| 17 | +RANK_DINER_INFO = "rank:diner:info" | ||
| 11 | -- -- role | 18 | -- -- role |
| 12 | -- R_FARM_KEY = "role:%d:farm" | 19 | -- R_FARM_KEY = "role:%d:farm" |
| 13 | -- R_TOWER_KEY = "role:%d:tower" | 20 | -- R_TOWER_KEY = "role:%d:tower" |
src/actions/DinerAction.lua
| @@ -67,6 +67,7 @@ function _M.addSellRpc( agent, data ) | @@ -67,6 +67,7 @@ function _M.addSellRpc( agent, data ) | ||
| 67 | if not sells[slot] then | 67 | if not sells[slot] then |
| 68 | sells[slot] = { | 68 | sells[slot] = { |
| 69 | reward = "", | 69 | reward = "", |
| 70 | + popular = 0, | ||
| 70 | } | 71 | } |
| 71 | end | 72 | end |
| 72 | sells[slot].dish = dish | 73 | sells[slot].dish = dish |
| @@ -123,7 +124,7 @@ end | @@ -123,7 +124,7 @@ end | ||
| 123 | function _M.getSellRewardRpc( agent, data ) | 124 | function _M.getSellRewardRpc( agent, data ) |
| 124 | local role = agent.role | 125 | local role = agent.role |
| 125 | local dirty = false | 126 | local dirty = false |
| 126 | - local reward = "" | 127 | + local reward, popular = "", 0 |
| 127 | local sells = json.decode(role.dinerData:getProperty("sells")) | 128 | local sells = json.decode(role.dinerData:getProperty("sells")) |
| 128 | for slot, _ in pairs(sells) do | 129 | for slot, _ in pairs(sells) do |
| 129 | role.dinerData:updateSell(slot) | 130 | role.dinerData:updateSell(slot) |
| @@ -134,6 +135,7 @@ function _M.getSellRewardRpc( agent, data ) | @@ -134,6 +135,7 @@ function _M.getSellRewardRpc( agent, data ) | ||
| 134 | for k,v in pairs(rewards) do | 135 | for k,v in pairs(rewards) do |
| 135 | reward = reward:incrv(k, v) | 136 | reward = reward:incrv(k, v) |
| 136 | end | 137 | end |
| 138 | + popular = popular + (sell.popular or 0) | ||
| 137 | 139 | ||
| 138 | if rewards[ItemId.Gold] and rewards[ItemId.Gold] > 0 then | 140 | if rewards[ItemId.Gold] and rewards[ItemId.Gold] > 0 then |
| 139 | if role.dinerData:checkDinerTask(DinerTask.DishWithGold, rewards[ItemId.Gold], sell.dish, nil, true) then | 141 | if role.dinerData:checkDinerTask(DinerTask.DishWithGold, rewards[ItemId.Gold], sell.dish, nil, true) then |
| @@ -148,12 +150,15 @@ function _M.getSellRewardRpc( agent, data ) | @@ -148,12 +150,15 @@ function _M.getSellRewardRpc( agent, data ) | ||
| 148 | end | 150 | end |
| 149 | end | 151 | end |
| 150 | sells[slot].reward = "" | 152 | sells[slot].reward = "" |
| 153 | + sells[slot].popular = 0 | ||
| 151 | end | 154 | end |
| 152 | role.dinerData:updateProperty({field = "sells", value = json.encode(sells)}) | 155 | role.dinerData:updateProperty({field = "sells", value = json.encode(sells)}) |
| 153 | for k, v in pairs(reward:toNumMap()) do | 156 | for k, v in pairs(reward:toNumMap()) do |
| 154 | role:addItem({itemId = k,count = v}) | 157 | role:addItem({itemId = k,count = v}) |
| 155 | end | 158 | end |
| 156 | 159 | ||
| 160 | + role.dinerData:popularAdd(popular) | ||
| 161 | + | ||
| 157 | if dirty then | 162 | if dirty then |
| 158 | role.dinerData:notifyUpdateProperty("order", role.dinerData:getProperty("order")) | 163 | role.dinerData:notifyUpdateProperty("order", role.dinerData:getProperty("order")) |
| 159 | end | 164 | end |
| @@ -179,7 +184,7 @@ function _M.expediteSellRpc( agent, data ) | @@ -179,7 +184,7 @@ function _M.expediteSellRpc( agent, data ) | ||
| 179 | end | 184 | end |
| 180 | 185 | ||
| 181 | local dirty = false | 186 | local dirty = false |
| 182 | - local reward,popular = "",0 | 187 | + local reward,popular = "", 0 |
| 183 | local sells = json.decode(role.dinerData:getProperty("sells")) | 188 | local sells = json.decode(role.dinerData:getProperty("sells")) |
| 184 | for slot, _ in pairs(sells) do | 189 | for slot, _ in pairs(sells) do |
| 185 | role.dinerData:updateSell(slot) | 190 | role.dinerData:updateSell(slot) |
| @@ -216,6 +221,8 @@ function _M.expediteSellRpc( agent, data ) | @@ -216,6 +221,8 @@ function _M.expediteSellRpc( agent, data ) | ||
| 216 | role:addItem({itemId = k,count = v}) | 221 | role:addItem({itemId = k,count = v}) |
| 217 | end | 222 | end |
| 218 | 223 | ||
| 224 | + role.dinerData:popularAdd(popular) | ||
| 225 | + | ||
| 219 | if dirty then | 226 | if dirty then |
| 220 | role.dinerData:notifyUpdateProperty("order", role.dinerData:getProperty("order")) | 227 | role.dinerData:notifyUpdateProperty("order", role.dinerData:getProperty("order")) |
| 221 | end | 228 | end |
| @@ -681,4 +688,13 @@ function _M.handleTaskRpc(agent, data) | @@ -681,4 +688,13 @@ function _M.handleTaskRpc(agent, data) | ||
| 681 | return true | 688 | return true |
| 682 | end | 689 | end |
| 683 | 690 | ||
| 691 | +function _M.rankRpc(agent , data) | ||
| 692 | + local role = agent.role | ||
| 693 | + | ||
| 694 | + local rankInfo = role.dinerData:getPopularRank() | ||
| 695 | + SendPacket(actionCodes.Diner_rankRpc, MsgPack.pack(rankInfo)) | ||
| 696 | + return true | ||
| 697 | +end | ||
| 698 | + | ||
| 699 | + | ||
| 684 | return _M | 700 | return _M |
| 685 | \ No newline at end of file | 701 | \ No newline at end of file |
src/actions/RoleAction.lua
| @@ -120,6 +120,7 @@ function _M.loginRpc( agent, data ) | @@ -120,6 +120,7 @@ function _M.loginRpc( agent, data ) | ||
| 120 | 120 | ||
| 121 | -- 跨天登陆事件 | 121 | -- 跨天登陆事件 |
| 122 | role:onCrossDay(now) | 122 | role:onCrossDay(now) |
| 123 | + role:onResetRank(now) | ||
| 123 | role:setProperty("ltime", now) | 124 | role:setProperty("ltime", now) |
| 124 | 125 | ||
| 125 | 126 |
src/actions/TowerAction.lua
| @@ -86,6 +86,9 @@ function _M.endBattleRpc(agent, data) | @@ -86,6 +86,9 @@ function _M.endBattleRpc(agent, data) | ||
| 86 | local reward | 86 | local reward |
| 87 | if msg.starNum and msg.starNum > 0 then --win | 87 | if msg.starNum and msg.starNum > 0 then --win |
| 88 | curCount = math.min(curCount + 1, globalCsv.tower_count_limit) -- 返还次数 | 88 | curCount = math.min(curCount + 1, globalCsv.tower_count_limit) -- 返还次数 |
| 89 | + --排行榜 | ||
| 90 | + role:setTowerRank(towerInfo.l) | ||
| 91 | + | ||
| 89 | towerInfo.l = towerInfo.l + 1 | 92 | towerInfo.l = towerInfo.l + 1 |
| 90 | reward = role:award(curTower.reward) | 93 | reward = role:award(curTower.reward) |
| 91 | end | 94 | end |
| @@ -122,9 +125,15 @@ end | @@ -122,9 +125,15 @@ end | ||
| 122 | 125 | ||
| 123 | function _M.rankRpc(agent , data) | 126 | function _M.rankRpc(agent , data) |
| 124 | local role = agent.role | 127 | local role = agent.role |
| 128 | + SendPacket(actionCodes.Tower_rankRpc, MsgPack.pack(role:getTowerRank())) | ||
| 129 | + return true | ||
| 130 | +end | ||
| 125 | 131 | ||
| 126 | - local rankList = {} | ||
| 127 | - SendPacket(actionCodes.Tower_rankRpc, MsgPack.pack({rankList = rankList})) | 132 | +function _M.rankInfoRpc(agent , data) |
| 133 | + local role = agent.role | ||
| 134 | + local msg = MsgPack.unpack(data) | ||
| 135 | + local roleId = msg.roleId | ||
| 136 | + SendPacket(actionCodes.Tower_rankInfoRpc, MsgPack.pack({format = role:getTowerRankOneInfo(roleId)})) | ||
| 128 | return true | 137 | return true |
| 129 | end | 138 | end |
| 130 | 139 |
src/models/Diner.lua
| @@ -16,11 +16,14 @@ Diner.schema = { | @@ -16,11 +16,14 @@ Diner.schema = { | ||
| 16 | task = {"table", {}}, -- 任务刷新 {et = 消失时间 id = 任务id, refuse = 0} | 16 | task = {"table", {}}, -- 任务刷新 {et = 消失时间 id = 任务id, refuse = 0} |
| 17 | } | 17 | } |
| 18 | 18 | ||
| 19 | +function Diner:rankResetData(notify) | ||
| 20 | + self:updateProperty({field = "popular", value = 0, notNotify = not notify}) | ||
| 21 | +end | ||
| 22 | + | ||
| 19 | function Diner:refreshDailyData(notify) | 23 | function Diner:refreshDailyData(notify) |
| 20 | -- 每日加速次数 | 24 | -- 每日加速次数 |
| 21 | self:updateProperty({field = "expedite", value = 1, notNotify = not notify}) | 25 | self:updateProperty({field = "expedite", value = 1, notNotify = not notify}) |
| 22 | self:setProperty("expedite", 1) | 26 | self:setProperty("expedite", 1) |
| 23 | - | ||
| 24 | -- 特殊订单 | 27 | -- 特殊订单 |
| 25 | local orders = json.decode(self:getProperty("order")) | 28 | local orders = json.decode(self:getProperty("order")) |
| 26 | local hadTask = {} | 29 | local hadTask = {} |
| @@ -170,8 +173,8 @@ function Diner:updateSell(slot, calOnly) | @@ -170,8 +173,8 @@ function Diner:updateSell(slot, calOnly) | ||
| 170 | sells[slot].count = lastCount | 173 | sells[slot].count = lastCount |
| 171 | sells[slot].level = self:getProperty("dishTree"):getv(sell.dish, 1) | 174 | sells[slot].level = self:getProperty("dishTree"):getv(sell.dish, 1) |
| 172 | sells[slot].reward = reward | 175 | sells[slot].reward = reward |
| 176 | + sells[slot].popular = (sells[slot].popular or 0) + popular | ||
| 173 | self:setProperty("sells", json.encode(sells)) | 177 | self:setProperty("sells", json.encode(sells)) |
| 174 | - self:updateProperty({field = "popular", delta = popular}) | ||
| 175 | self:checkDinerTask(DinerTask.SellDish, deltaCount, sell.dish) | 178 | self:checkDinerTask(DinerTask.SellDish, deltaCount, sell.dish) |
| 176 | self:checkDinerTask(DinerTask.SellDishType, deltaCount, math.ceil(sell.dish / 100)) | 179 | self:checkDinerTask(DinerTask.SellDishType, deltaCount, math.ceil(sell.dish / 100)) |
| 177 | self:checkDinerTask(DinerTask.SellDishRare, deltaCount, dishData.rarity) | 180 | self:checkDinerTask(DinerTask.SellDishRare, deltaCount, dishData.rarity) |
| @@ -181,7 +184,6 @@ function Diner:updateSell(slot, calOnly) | @@ -181,7 +184,6 @@ function Diner:updateSell(slot, calOnly) | ||
| 181 | deltaTime = deltaTime, | 184 | deltaTime = deltaTime, |
| 182 | lastCount = lastCount, | 185 | lastCount = lastCount, |
| 183 | reward = reward, | 186 | reward = reward, |
| 184 | - popular = popular, | ||
| 185 | } | 187 | } |
| 186 | end | 188 | end |
| 187 | 189 | ||
| @@ -204,7 +206,6 @@ function Diner:expediteSell(slot) | @@ -204,7 +206,6 @@ function Diner:expediteSell(slot) | ||
| 204 | sells[slot].time = sell.time - deltaTime | 206 | sells[slot].time = sell.time - deltaTime |
| 205 | sells[slot].count = lastCount | 207 | sells[slot].count = lastCount |
| 206 | self:setProperty("sells", json.encode(sells)) | 208 | self:setProperty("sells", json.encode(sells)) |
| 207 | - self:updateProperty({field = "popular", delta = popular}) | ||
| 208 | self:checkDinerTask(DinerTask.SellDish, expediteCount, sell.dish) | 209 | self:checkDinerTask(DinerTask.SellDish, expediteCount, sell.dish) |
| 209 | self:checkDinerTask(DinerTask.SellDishType, expediteCount, math.ceil(sell.dish / 100)) | 210 | self:checkDinerTask(DinerTask.SellDishType, expediteCount, math.ceil(sell.dish / 100)) |
| 210 | self:checkDinerTask(DinerTask.SellDishRare, expediteCount, dishData.rarity) | 211 | self:checkDinerTask(DinerTask.SellDishRare, expediteCount, dishData.rarity) |
| @@ -233,15 +234,61 @@ end | @@ -233,15 +234,61 @@ end | ||
| 233 | function Diner:getMaxDishs() | 234 | function Diner:getMaxDishs() |
| 234 | local dishCount = globalCsv.diner_sell_dish_init | 235 | local dishCount = globalCsv.diner_sell_dish_init |
| 235 | 236 | ||
| 236 | - local buildingCsv = csvdb["diner_buildingCsv"] | ||
| 237 | - for id, level in pairs(self:getProperty("buildL"):toNumMap()) do | ||
| 238 | - if buildingCsv[id][level].storage > 0 then | ||
| 239 | - dishCount = dishCount + buildingCsv[id][level].storage | ||
| 240 | - end | ||
| 241 | - end | 237 | + -- local buildingCsv = csvdb["diner_buildingCsv"] |
| 238 | + -- for id, level in pairs(self:getProperty("buildL"):toNumMap()) do | ||
| 239 | + -- if buildingCsv[id][level].storage > 0 then | ||
| 240 | + -- dishCount = dishCount + buildingCsv[id][level].storage | ||
| 241 | + -- end | ||
| 242 | + -- end | ||
| 242 | return dishCount | 243 | return dishCount |
| 243 | end | 244 | end |
| 244 | 245 | ||
| 246 | +function Diner:popularAdd(popular) | ||
| 247 | + if popular ~= 0 then | ||
| 248 | + self:updateProperty({field = "popular", delta = popular}) | ||
| 249 | + local dbKey = self.owner:getCurDinerRankKey() | ||
| 250 | + local roleId = self.owner:getProperty("id") | ||
| 251 | + -- 更新排行榜 | ||
| 252 | + local curPopular = self:getProperty("popular") | ||
| 253 | + redisproxy:pipelining(function (red) | ||
| 254 | + red:zadd(dbKey, curPopular, roleId) --更新分数 | ||
| 255 | + red:hset(RANK_DINER_INFO, roleId, MsgPack.pack({ | ||
| 256 | + lv = self:getProperty("buildL"):getv(1, 0), | ||
| 257 | + name = self.owner:getProperty("name"), | ||
| 258 | + headId = self.owner:getProperty("headId") | ||
| 259 | + })) | ||
| 260 | + end) | ||
| 261 | + end | ||
| 262 | +end | ||
| 263 | + | ||
| 264 | +function Diner:getPopularRank() | ||
| 265 | + local dbKey = self.owner:getCurDinerRankKey() | ||
| 266 | + local list = {} | ||
| 267 | + local ids = redisproxy:zrevrange(dbKey, 0 , 99, "WITHSCORES") | ||
| 268 | + local redret = {} | ||
| 269 | + if ids and next(ids) then | ||
| 270 | + redret = redisproxy:pipelining(function (red) | ||
| 271 | + for i = 1, #ids, 2 do | ||
| 272 | + local roleId = ids[i] | ||
| 273 | + local score = ids[i + 1] | ||
| 274 | + list[#list + 1] = {score = tonumber(score), roleId = tonumber(roleId)} | ||
| 275 | + red:hget(RANK_DINER_INFO, roleId) | ||
| 276 | + end | ||
| 277 | + end) | ||
| 278 | + end | ||
| 279 | + for i = 1, #redret do | ||
| 280 | + local player = MsgPack.unpack(redret[i]) | ||
| 281 | + list[i].player = player | ||
| 282 | + end | ||
| 283 | + local rank = redisproxy:ZREVRANK(dbKey, self.owner:getProperty("id")) | ||
| 284 | + if not rank then | ||
| 285 | + rank = -1 | ||
| 286 | + else | ||
| 287 | + rank = rank + 1 | ||
| 288 | + end | ||
| 289 | + return {list = list, rank = rank} | ||
| 290 | +end | ||
| 291 | + | ||
| 245 | function Diner:data() | 292 | function Diner:data() |
| 246 | local properties = {"buildL", "order", "sells", "dishTree", "skillTree","popular","expedite","gfood", "task"} | 293 | local properties = {"buildL", "order", "sells", "dishTree", "skillTree","popular","expedite","gfood", "task"} |
| 247 | local data = self:getProperties(properties) | 294 | local data = self:getProperties(properties) |
src/models/Role.lua
| @@ -22,6 +22,7 @@ Role.schema = { | @@ -22,6 +22,7 @@ Role.schema = { | ||
| 22 | id = {"number"}, | 22 | id = {"number"}, |
| 23 | uid = {"string", ""}, | 23 | uid = {"string", ""}, |
| 24 | name = {"string", ""}, | 24 | name = {"string", ""}, |
| 25 | + headId = {"number", 3201}, | ||
| 25 | sid = {"number", 0}, | 26 | sid = {"number", 0}, |
| 26 | device = {"string", ""}, | 27 | device = {"string", ""}, |
| 27 | banTime = {"number", 0}, | 28 | banTime = {"number", 0}, |
| @@ -178,6 +179,7 @@ function Role:data() | @@ -178,6 +179,7 @@ function Role:data() | ||
| 178 | return { | 179 | return { |
| 179 | id = self:getProperty("id"), | 180 | id = self:getProperty("id"), |
| 180 | name = self:getProperty("name"), | 181 | name = self:getProperty("name"), |
| 182 | + headId = self:getProperty("headId"), | ||
| 181 | level = self:getProperty("level"), | 183 | level = self:getProperty("level"), |
| 182 | exp = self:getProperty("exp"), | 184 | exp = self:getProperty("exp"), |
| 183 | items = self:getProperty("items"):toNumMap(), | 185 | items = self:getProperty("items"):toNumMap(), |
src/models/RolePlugin.lua
| @@ -31,9 +31,37 @@ function RolePlugin.bind(Role) | @@ -31,9 +31,37 @@ function RolePlugin.bind(Role) | ||
| 31 | if notify then | 31 | if notify then |
| 32 | self:notifyUpdateProperties(response) | 32 | self:notifyUpdateProperties(response) |
| 33 | end | 33 | end |
| 34 | + | ||
| 35 | + if RESET_TIME == RESET_RANK_TIME then | ||
| 36 | + self:onResetRank_raw(ltime, now, notify) | ||
| 37 | + end | ||
| 38 | + self:setProperty("ltime", now) | ||
| 34 | return true | 39 | return true |
| 35 | end | 40 | end |
| 36 | end | 41 | end |
| 42 | + | ||
| 43 | + function Role:onResetRank(now, notify) | ||
| 44 | + local ltime = self:getProperty("ltime") | ||
| 45 | + if isCrossDay(ltime, now, RESET_RANK_TIME) then | ||
| 46 | + local response = self:onResetRank_raw(ltime, now, notify) | ||
| 47 | + | ||
| 48 | + if notify and next(response) then | ||
| 49 | + self:notifyUpdateProperties(response) | ||
| 50 | + end | ||
| 51 | + | ||
| 52 | + self:setProperty("ltime", now) | ||
| 53 | + return true | ||
| 54 | + end | ||
| 55 | + end | ||
| 56 | + | ||
| 57 | + function Role:onResetRank_raw(ltime, now, notify) | ||
| 58 | + local response = {} | ||
| 59 | + | ||
| 60 | + self.dinerData:rankResetData(notify) | ||
| 61 | + | ||
| 62 | + return response | ||
| 63 | + end | ||
| 64 | + | ||
| 37 | function Role:onOfflineEvent() | 65 | function Role:onOfflineEvent() |
| 38 | 66 | ||
| 39 | end | 67 | end |
| @@ -613,7 +641,8 @@ function RolePlugin.bind(Role) | @@ -613,7 +641,8 @@ function RolePlugin.bind(Role) | ||
| 613 | self:changeUpdates({{type = "funcOpen", field = unlockData.type, value = 1}}) | 641 | self:changeUpdates({{type = "funcOpen", field = unlockData.type, value = 1}}) |
| 614 | else | 642 | else |
| 615 | local oldV = self:getFuncLv(unlockData.type) | 643 | local oldV = self:getFuncLv(unlockData.type) |
| 616 | - self:changeUpdates({{type = "funcLv", field = unlockData.type, value = oldV + count}}) | 644 | + local newLv = math.min(oldV + count, unlockData.value2) |
| 645 | + self:changeUpdates({{type = "funcLv", field = unlockData.type, value = newLv}}) | ||
| 617 | end | 646 | end |
| 618 | else | 647 | else |
| 619 | self:changeUpdates({{type = "funcOpen", field = func, value = 1}}) | 648 | self:changeUpdates({{type = "funcOpen", field = func, value = 1}}) |
| @@ -661,6 +690,97 @@ function RolePlugin.bind(Role) | @@ -661,6 +690,97 @@ function RolePlugin.bind(Role) | ||
| 661 | self:setProperty("advElS", globalCsv.adv_endless_season) | 690 | self:setProperty("advElS", globalCsv.adv_endless_season) |
| 662 | end | 691 | end |
| 663 | end | 692 | end |
| 693 | + | ||
| 694 | + function Role:getTeamBattleValue(heros) | ||
| 695 | + local battleV = 0 | ||
| 696 | + for _, heroId in pairs(heros) do | ||
| 697 | + local hero = self.heros[heroId] | ||
| 698 | + battleV = battleV + hero:getProperty("battleV") | ||
| 699 | + end | ||
| 700 | + return battleV | ||
| 701 | + end | ||
| 702 | + | ||
| 703 | + function Role:recordRankTeam(heroIds) | ||
| 704 | + local heros = {} | ||
| 705 | + for slot, heroId in pairs(heroIds) do | ||
| 706 | + local hero = self.heros[heroId] | ||
| 707 | + heros[slot] = { | ||
| 708 | + htype = hero:getProperty("type"), | ||
| 709 | + lv = hero:getProperty("level"), | ||
| 710 | + breakL = hero:getProperty("breakL"), | ||
| 711 | + } | ||
| 712 | + end | ||
| 713 | + return heros | ||
| 714 | + end | ||
| 715 | + | ||
| 716 | + local StdDinerRankTime = toUnixtime("20190101"..string.format("%02x", RESET_RANK_TIME)) --跨天时间 | ||
| 717 | + function Role:getCurDinerRankKey() | ||
| 718 | + local now = skynet.timex() | ||
| 719 | + local idx = 1 | ||
| 720 | + if math.floor((now - StdDinerRankTime) / 86400) % 2 == 1 then | ||
| 721 | + idx = 2 | ||
| 722 | + end | ||
| 723 | + return RANK_DINER[idx] | ||
| 724 | + end | ||
| 725 | + | ||
| 726 | + local StdTowerRankTime = toUnixtime("2019010100") | ||
| 727 | + function Role:setTowerRank(level) | ||
| 728 | + local now = skynet.timex() | ||
| 729 | + local ct = math.ceil((now - StdTowerRankTime) / 86400) --按天计算 365 * 27 < 10000 可以维持 27 年 | ||
| 730 | + local ct = 10000 - ct -- 越早的排名越靠前 | ||
| 731 | + local towerTeam = self:getProperty("towerF") | ||
| 732 | + local battleV = self:getTeamBattleValue(towerTeam.heros) | ||
| 733 | + local score = (level * 10000 + ct) * 10000000 + battleV | ||
| 734 | + | ||
| 735 | + local curInfo = { | ||
| 736 | + name = self:getProperty("name"), | ||
| 737 | + headId = self:getProperty("headId"), | ||
| 738 | + lv = self:getProperty("level"), | ||
| 739 | + batteV = battleV, | ||
| 740 | + level = level, | ||
| 741 | + format = self:recordRankTeam(towerTeam.heros), | ||
| 742 | + } | ||
| 743 | + local roleId = self:getProperty("id") | ||
| 744 | + redisproxy:pipelining(function (red) | ||
| 745 | + red:zadd(RANK_TOWER, score, roleId) --更新分数 | ||
| 746 | + red:hset(RANK_TOWER_INFO, roleId, MsgPack.pack(curInfo)) | ||
| 747 | + end) | ||
| 748 | + end | ||
| 749 | + | ||
| 750 | + function Role:getTowerRank() | ||
| 751 | + local list = {} | ||
| 752 | + local ids = redisproxy:zrevrange(RANK_TOWER, 0 , 99) | ||
| 753 | + local redret = {} | ||
| 754 | + if ids and next(ids) then | ||
| 755 | + redret = redisproxy:pipelining(function (red) | ||
| 756 | + for i = 1, #ids do | ||
| 757 | + local roleId = ids[i] | ||
| 758 | + table.insert(list, {roleId = tonumber(roleId)}) | ||
| 759 | + red:hget(RANK_TOWER_INFO, roleId) | ||
| 760 | + end | ||
| 761 | + end) | ||
| 762 | + end | ||
| 763 | + for i = 1, #redret do | ||
| 764 | + local player = MsgPack.unpack(redret[i]) | ||
| 765 | + player.format = nil | ||
| 766 | + list[i].player = player | ||
| 767 | + end | ||
| 768 | + local rank = redisproxy:ZREVRANK(RANK_TOWER, self:getProperty("id")) | ||
| 769 | + if not rank then | ||
| 770 | + rank = -1 | ||
| 771 | + else | ||
| 772 | + rank = rank + 1 | ||
| 773 | + end | ||
| 774 | + return {list = list, rank = rank} | ||
| 775 | + end | ||
| 776 | + | ||
| 777 | + function Role:getTowerRankOneInfo(roleId) | ||
| 778 | + local data = redisproxy:hget(RANK_TOWER_INFO, roleId) | ||
| 779 | + if data then | ||
| 780 | + local player = MsgPack.unpack(data) | ||
| 781 | + return player.format | ||
| 782 | + end | ||
| 783 | + end | ||
| 664 | end | 784 | end |
| 665 | 785 | ||
| 666 | return RolePlugin | 786 | return RolePlugin |
| 667 | \ No newline at end of file | 787 | \ No newline at end of file |
src/services/agent_util.lua
| @@ -41,6 +41,7 @@ end | @@ -41,6 +41,7 @@ end | ||
| 41 | 41 | ||
| 42 | local PointDataMark = {} | 42 | local PointDataMark = {} |
| 43 | local resetTimeStr = string.format("%02d00", RESET_TIME) | 43 | local resetTimeStr = string.format("%02d00", RESET_TIME) |
| 44 | +local resetRankTimeStr = string.format("%02d00", RESET_RANK_TIME) | ||
| 44 | 45 | ||
| 45 | local function check_daily_reset(agent, now) | 46 | local function check_daily_reset(agent, now) |
| 46 | local date = os.date("*t", now) | 47 | local date = os.date("*t", now) |
| @@ -66,6 +67,13 @@ local function check_daily_reset(agent, now) | @@ -66,6 +67,13 @@ local function check_daily_reset(agent, now) | ||
| 66 | role:onCrossDay(now, true) | 67 | role:onCrossDay(now, true) |
| 67 | end | 68 | end |
| 68 | end | 69 | end |
| 70 | + if resetTimeStr ~= resetRankTimeStr and timeEffect(resetRankTimeStr) then | ||
| 71 | + -- 刷新排行榜需要重置的数据 | ||
| 72 | + local role = agent.role | ||
| 73 | + if role then | ||
| 74 | + role:onResetRank(now, true) | ||
| 75 | + end | ||
| 76 | + end | ||
| 69 | end | 77 | end |
| 70 | 78 | ||
| 71 | function _M:update(agent) | 79 | function _M:update(agent) |
| @@ -76,7 +84,7 @@ function _M:update(agent) | @@ -76,7 +84,7 @@ function _M:update(agent) | ||
| 76 | nextCheckTime = now + HEART_TIMER_INTERVAL | 84 | nextCheckTime = now + HEART_TIMER_INTERVAL |
| 77 | end | 85 | end |
| 78 | pcall(check_daily_reset, agent, now) | 86 | pcall(check_daily_reset, agent, now) |
| 79 | - pcall(role.onRecoverTimer, role, now) | 87 | + -- pcall(role.onRecoverTimer, role, now) |
| 80 | end | 88 | end |
| 81 | 89 | ||
| 82 | function _M:heart_beat(agent) | 90 | function _M:heart_beat(agent) |
src/utils/CommonFunc.lua
| @@ -109,11 +109,12 @@ function isCrossMonth(target, now) | @@ -109,11 +109,12 @@ function isCrossMonth(target, now) | ||
| 109 | end | 109 | end |
| 110 | end | 110 | end |
| 111 | 111 | ||
| 112 | -function isCrossDay(lastTime, now) | 112 | +function isCrossDay(lastTime, now, resetTime) |
| 113 | + resetTime = resetTime or RESET_TIME | ||
| 113 | if lastTime == 0 then return true end | 114 | if lastTime == 0 then return true end |
| 114 | now = now or skynet.timex() | 115 | now = now or skynet.timex() |
| 115 | - local today4h = specTime({hour = RESET_TIME}, now - RESET_TIME * 3600) | ||
| 116 | - return lastTime < today4h and now >= today4h | 116 | + local todayResetH = specTime({hour = resetTime}, now - resetTime * 3600) |
| 117 | + return lastTime < todayResetH and now >= todayResetH | ||
| 117 | end | 118 | end |
| 118 | 119 | ||
| 119 | function crossDay(target, now) | 120 | function crossDay(target, now) |