Commit a94f25f8b7bd4a70d628f679f90657416f8c9bb0
Merge branch 'tr/bugfix' into tr/publish/preview
Showing
10 changed files
with
501 additions
and
4 deletions
Show diff stats
src/ProtocolCode.lua
@@ -241,6 +241,13 @@ actionCodes = { | @@ -241,6 +241,13 @@ actionCodes = { | ||
241 | Radio_startQuestRpc = 700, | 241 | Radio_startQuestRpc = 700, |
242 | Radio_finishQuestRpc = 701, | 242 | Radio_finishQuestRpc = 701, |
243 | Radio_cancelQuestRpc = 702, | 243 | Radio_cancelQuestRpc = 702, |
244 | + | ||
245 | + Seaport_getServerProcessRpc = 750, | ||
246 | + Seaport_donateRpc = 751, | ||
247 | + Seaport_donateRewardRpc = 752, | ||
248 | + Seaport_taskRpc = 753, | ||
249 | + Seaport_shopRpc = 754, | ||
250 | + Seaport_resetRpc = 755, | ||
244 | } | 251 | } |
245 | 252 | ||
246 | rpcResponseBegin = 10000 | 253 | rpcResponseBegin = 10000 |
src/RedisKeys.lua
@@ -49,8 +49,8 @@ RANK_PVP_HIGHT = "rank:pvph" | @@ -49,8 +49,8 @@ RANK_PVP_HIGHT = "rank:pvph" | ||
49 | RANK_PVP_HIGHT_KEY = {"rank:pvph1", "rank:pvph2"} | 49 | RANK_PVP_HIGHT_KEY = {"rank:pvph1", "rank:pvph2"} |
50 | RECORD_PVP_HIGH = "record:pvph:%d" | 50 | RECORD_PVP_HIGH = "record:pvph:%d" |
51 | 51 | ||
52 | - | ||
53 | - | 52 | +SEAPORT_TRADE_TASK_1 = "seaport:task1" |
53 | +SEAPORT_TRADE_TASK_2 = "seaport:task2" | ||
54 | 54 | ||
55 | FRIEND_KEY = "role:%d:friend" --哈希表 好友 | 55 | FRIEND_KEY = "role:%d:friend" --哈希表 好友 |
56 | FRIEND_APPLY_KEY = "role:%d:apply" -- sort set 申请列表 | 56 | FRIEND_APPLY_KEY = "role:%d:apply" -- sort set 申请列表 |
src/actions/RoleAction.lua
@@ -159,6 +159,7 @@ function _M.loginRpc( agent, data ) | @@ -159,6 +159,7 @@ function _M.loginRpc( agent, data ) | ||
159 | role:changeStructVersion() -- 数据结构 版本更新 | 159 | role:changeStructVersion() -- 数据结构 版本更新 |
160 | role:getAdvData(true) -- 清掉不合格的数据 | 160 | role:getAdvData(true) -- 清掉不合格的数据 |
161 | role:advEndlessSeasonCheck(true) -- 冒险赛季更新检查 | 161 | role:advEndlessSeasonCheck(true) -- 冒险赛季更新检查 |
162 | + role:checkSeaportTrade() -- 检查海港贸易季活动 | ||
162 | 163 | ||
163 | -- 跨天登陆事件 | 164 | -- 跨天登陆事件 |
164 | local resetMode = role:updateTimeReset(now) | 165 | local resetMode = role:updateTimeReset(now) |
@@ -0,0 +1,296 @@ | @@ -0,0 +1,296 @@ | ||
1 | +local ipairs = ipairs | ||
2 | +local table = table | ||
3 | +local math = math | ||
4 | +local redisproxy = redisproxy | ||
5 | +local MsgPack = MsgPack | ||
6 | + | ||
7 | +local _M = {} | ||
8 | + | ||
9 | +function _M.getServerProcessRpc(agent, data) | ||
10 | + local role = agent.role | ||
11 | + local result = role:getSeaportServerProgress() | ||
12 | + | ||
13 | + SendPacket(actionCodes.Seaport_getServerProcessRpc, MsgPack.pack(result)) | ||
14 | + return true | ||
15 | +end | ||
16 | + | ||
17 | +function _M.donateRpc(agent, data) | ||
18 | + local role = agent.role | ||
19 | + local msg = MsgPack.unpack(data) | ||
20 | + | ||
21 | + local phase = msg.phase or 0 | ||
22 | + local id = msg.id or 0 | ||
23 | + local itemId = msg.itemId or 0 | ||
24 | + local itemCount = msg.count or 0 | ||
25 | + | ||
26 | + if itemId == 0 or itemCount == 0 then return 0 end | ||
27 | + if role:getItemCount(itemId) < itemCount then return 1 end | ||
28 | + local DonateCsv = csvdb["seaport_purchaseCsv"] | ||
29 | + if not DonateCsv[phase] or not DonateCsv[phase][id] then return 2 end | ||
30 | + | ||
31 | + local ddata = DonateCsv[phase][id] | ||
32 | + local needs = ddata.need_item:toArray(true,"=") | ||
33 | + if itemId ~= needs[1] then return 3 end | ||
34 | + if itemCount % needs[2] ~= 0 then return 4 end | ||
35 | + | ||
36 | + local group = itemCount / needs[2] | ||
37 | + local rewards = ddata.award:toNumMap() | ||
38 | + | ||
39 | + for id, value in pairs(rewards) do | ||
40 | + rewards[id] = value * group | ||
41 | + end | ||
42 | + | ||
43 | + if phase == 1 then | ||
44 | + local old = tonumber(redisproxy:hget(SEAPORT_TRADE_TASK_1,id)) or 0 | ||
45 | + local need = ddata.need_num - old | ||
46 | + if need >= itemCount then | ||
47 | + redisproxy:hincrby(SEAPORT_TRADE_TASK_1,id,itemCount) | ||
48 | + else | ||
49 | + redisproxy:hincrby(SEAPORT_TRADE_TASK_1,id,need) | ||
50 | + for _, temp in pairs(DonateCsv[2]) do | ||
51 | + local items = temp.need_item:toArray(true,"=") | ||
52 | + if items[1] == itemId then | ||
53 | + redisproxy:hincrby(SEAPORT_TRADE_TASK_2,temp.id,itemCount - need) | ||
54 | + break | ||
55 | + end | ||
56 | + end | ||
57 | + end | ||
58 | + else | ||
59 | + redisproxy:hincrby(SEAPORT_TRADE_TASK_2,id,itemCount) | ||
60 | + end | ||
61 | + | ||
62 | + role:costItems({[itemId] = itemCount}, {log = {desc = "seaportDonate", int1 = phase, int2 = id}}) | ||
63 | + local reward, change = role:award(rewards, {log = {desc = "seaportDonate", int1 = ddata.phase, int2 = ddata.id}}) | ||
64 | + | ||
65 | + role:mylog("role_action", {desc = "seaportDonate", int1 = itemId, int2 = itemCount}) | ||
66 | + | ||
67 | + SendPacket(actionCodes.Seaport_donateRpc, MsgPack.pack(role:packReward(reward, change))) | ||
68 | + return true | ||
69 | +end | ||
70 | + | ||
71 | +function _M.donateRewardRpc(agent, data) | ||
72 | + local role = agent.role | ||
73 | + local msg = MsgPack.unpack(data) | ||
74 | + | ||
75 | + local id = msg.id | ||
76 | + local dataCsv = csvdb["seaport_purchaseCsv"] | ||
77 | + if not dataCsv[id] then return 0 end | ||
78 | + | ||
79 | + local seaport = role:getProperty("seaport") or {} | ||
80 | + local donate = seaport.donate or {} | ||
81 | + if donate[id] then return 3 end | ||
82 | + | ||
83 | + local data = dataCsv[id][1] | ||
84 | + | ||
85 | + local result = role:getSeaportServerProgress() | ||
86 | + if not result[id] then return 1 end | ||
87 | + | ||
88 | + for _, tempData in ipairs(dataCsv[id]) do | ||
89 | + if tempData.need_num > (result[id][tempData.id] or 0) then | ||
90 | + return 2 | ||
91 | + end | ||
92 | + end | ||
93 | + | ||
94 | + donate[id] = 1 | ||
95 | + seaport.donate = donate | ||
96 | + | ||
97 | + local reward, change = role:award(data.phase_award, {log = {desc = "seaportReward", int1 = data.phase, int2 = data.id}}) | ||
98 | + | ||
99 | + role:updateProperty({field = "seaport", value = seaport}) | ||
100 | + SendPacket(actionCodes.Seaport_donateRewardRpc, MsgPack.pack(role:packReward(reward, change))) | ||
101 | + return true | ||
102 | +end | ||
103 | + | ||
104 | +-- 获取英雄大成功率 | ||
105 | +local function getHeroCoef(hero, condition) | ||
106 | + -- 基础概率 | ||
107 | + local rareMap = {[HeroQuality.N] = 10, [HeroQuality.R] = 10, [HeroQuality.SR] = 15, [HeroQuality.SSR] = 20} | ||
108 | + local rare = hero:getRare() | ||
109 | + local result = 0 | ||
110 | + for _, it in ipairs(condition:toTableArray(true)) do | ||
111 | + local type = it[1] | ||
112 | + local value = it[2] | ||
113 | + local add = it[3] | ||
114 | + if type == 1 then -- 种族加成 | ||
115 | + if hero:getCamp() == value then | ||
116 | + result = result + add | ||
117 | + end | ||
118 | + elseif type == 2 then -- 定位加成 | ||
119 | + if hero:getPosition() == value then | ||
120 | + result = result + add | ||
121 | + end | ||
122 | + end | ||
123 | + end | ||
124 | + | ||
125 | + return result + (rareMap[rare] or 0) | ||
126 | +end | ||
127 | + | ||
128 | +function _M.taskRpc(agent, data) | ||
129 | + local role = agent.role | ||
130 | + local msg = MsgPack.unpack(data) | ||
131 | + | ||
132 | + local oper = msg.oper or 0 | ||
133 | + local team = msg.team or "" | ||
134 | + local taskId = msg.id or 0 | ||
135 | + local level = msg.level or 0 | ||
136 | + | ||
137 | + if oper == 0 then return 0 end | ||
138 | + local TaskCsv = csvdb["seaport_taskCsv"] | ||
139 | + if not TaskCsv[taskId] or not TaskCsv[taskId][level] then return 1 end | ||
140 | + | ||
141 | + local reward, change = {}, {} | ||
142 | + local seaport = role:getProperty("seaport") | ||
143 | + | ||
144 | + local data = TaskCsv[taskId][level] | ||
145 | + if oper == 1 then -- 开始委托 | ||
146 | + if team == "" then return 3 end | ||
147 | + local conditions = data.condition:toTableArray(true) | ||
148 | + local heros = team:toArray(true,"=") | ||
149 | + if not next(heros) then return 8 end | ||
150 | + local UnitCsv = csvdb["unitCsv"] | ||
151 | + for _, conds in pairs(conditions) do | ||
152 | + local count = 0 | ||
153 | + for _, heroId in pairs(heros) do | ||
154 | + local hero = role.heros[heroId] | ||
155 | + if not hero then return 8 end | ||
156 | + | ||
157 | + if conds[1] == 1 then | ||
158 | + if hero:getProperty("level") >= conds[2] then | ||
159 | + count = count + 1 | ||
160 | + end | ||
161 | + elseif conds[1] == 2 then | ||
162 | + if UnitCsv[hero:getProperty("type")].rare >= conds[2] then | ||
163 | + count = count + 1 | ||
164 | + end | ||
165 | + elseif conds[1] == 3 then | ||
166 | + count = count + 1 | ||
167 | + end | ||
168 | + end | ||
169 | + if count < conds[#conds] then | ||
170 | + return 4 | ||
171 | + end | ||
172 | + end | ||
173 | + | ||
174 | + local collect = seaport.collect or {} | ||
175 | + collect[taskId] = {} | ||
176 | + collect[taskId].time = skynet.timex() | ||
177 | + collect[taskId].level = level | ||
178 | + collect[taskId].team = team | ||
179 | + | ||
180 | + seaport.collect = collect | ||
181 | + elseif oper == 2 then -- 领取委托奖励 | ||
182 | + local collects = seaport.collect or {} | ||
183 | + local collect = collects[taskId] or {} | ||
184 | + if not next(collects) or not next(collect) then | ||
185 | + return 5 | ||
186 | + end | ||
187 | + local quick = msg.quick | ||
188 | + local endTime = data.time + collect.time | ||
189 | + local remainT = endTime - skynet.timex() | ||
190 | + if not quick and remainT > 0 then return 6 end | ||
191 | + | ||
192 | + if quick and remainT > 0 then | ||
193 | + local cost = math.ceil(remainT / 3600) * globalCsv.seaport_task_quick | ||
194 | + if not role:checkItemEnough({[ItemId.Diamond] = cost}) then return 8 end | ||
195 | + role:costItems({[ItemId.Diamond] = cost}, {log = {desc = "seaportTask", int1 = taskId, int2 = level}}) | ||
196 | + end | ||
197 | + | ||
198 | + local carbonCsv = csvdb["idle_battleCsv"] | ||
199 | + local expCarbonId = role:getProperty("hangInfo").expCarbonId | ||
200 | + local coidCarbonId = role:getProperty("hangInfo").carbonId | ||
201 | + if not carbonCsv[expCarbonId] or not carbonCsv[coidCarbonId] then return 7 end | ||
202 | + | ||
203 | + local totalCoef = 0 | ||
204 | + for _, heroId in ipairs(collect.team:toArray(true,"=")) do | ||
205 | + local hero = role.heros[heroId] | ||
206 | + if hero then | ||
207 | + totalCoef = totalCoef + getHeroCoef(hero, data.success) | ||
208 | + hero:addHeroFaith(data.trust) | ||
209 | + end | ||
210 | + end | ||
211 | + | ||
212 | + local bigSuccess = false | ||
213 | + local result = math.randomInt(0, 100) | ||
214 | + if result < totalCoef then | ||
215 | + bigSuccess = true | ||
216 | + end | ||
217 | + | ||
218 | + local money = math.ceil(carbonCsv[coidCarbonId].money / 5 * data.time * carbonCsv[coidCarbonId].money_clear) | ||
219 | + local exp = math.ceil(carbonCsv[expCarbonId].exp / 5 * data.time * carbonCsv[expCarbonId].exp_clear) | ||
220 | + local itemReward = data.item_clear_special:toNumMap() | ||
221 | + itemReward[ItemId.Gold] = (itemReward[ItemId.Gold] or 0) + money | ||
222 | + itemReward[ItemId.Exp] = (itemReward[ItemId.Exp] or 0) + exp | ||
223 | + | ||
224 | + if bigSuccess then | ||
225 | + for key, value in pairs(itemReward) do | ||
226 | + itemReward[key] = math.ceil(1.5 * value) | ||
227 | + end | ||
228 | + end | ||
229 | + | ||
230 | + reward, change = role:award(itemReward, {log = {desc = "seaportTask", int1 = taskId, int2 = level}}) | ||
231 | + | ||
232 | + seaport.collect[taskId] = nil | ||
233 | + else | ||
234 | + return 0 | ||
235 | + end | ||
236 | + | ||
237 | + role:updateProperty({field = "seaport", value = seaport}) | ||
238 | + | ||
239 | + SendPacket(actionCodes.Seaport_taskRpc, MsgPack.pack(role:packReward(reward, change))) | ||
240 | + return true | ||
241 | +end | ||
242 | + | ||
243 | +function _M.shopRpc(agent, data) | ||
244 | + local role = agent.role | ||
245 | + local msg = MsgPack.unpack(data) | ||
246 | + local id = msg.id or 0 | ||
247 | + local count = msg.count or 1 | ||
248 | + | ||
249 | + local shopCsv = {} | ||
250 | + local dataSet = csvdb["shop_normalCsv"] | ||
251 | + for _, datat in pairs(dataSet) do | ||
252 | + if datat.shop == 5 then | ||
253 | + shopCsv[datat.id] = datat | ||
254 | + end | ||
255 | + end | ||
256 | + local sdata = shopCsv[id] | ||
257 | + | ||
258 | + if not sdata then return 2 end | ||
259 | + | ||
260 | + local seaport = role:getProperty("seaport") | ||
261 | + local shop = seaport.shop or {} | ||
262 | + | ||
263 | + if (shop[id] or 0) >= sdata.limit then return 1 end | ||
264 | + | ||
265 | + | ||
266 | + | ||
267 | + | ||
268 | + | ||
269 | + if role:getItemCount(sdata.icon) < sdata.cost * count then return 3 end | ||
270 | + | ||
271 | + role:costItems({[sdata.icon] = sdata.cost * count}, {log = {desc = "seaportShop", int1 = id, int2 = count}}) | ||
272 | + | ||
273 | + local itemReward = sdata.gift:toNumMap() | ||
274 | + for itemId, value in pairs(itemReward) do | ||
275 | + itemReward[itemId] = value * count | ||
276 | + end | ||
277 | + | ||
278 | + local reward, change = role:award(itemReward, {log = {desc = "seaportShop", int1 = id, int2 = count}}) | ||
279 | + | ||
280 | + shop[id] = (shop[id] or 0) + count | ||
281 | + seaport.shop = shop | ||
282 | + | ||
283 | + role:updateProperty({field = "seaport", value = seaport}) | ||
284 | + | ||
285 | + SendPacket(actionCodes.Seaport_shopRpc, MsgPack.pack(role:packReward(reward, change))) | ||
286 | + return true | ||
287 | +end | ||
288 | + | ||
289 | +function _M.resetRpc(agent, data) | ||
290 | + local role = agent.role | ||
291 | + role:checkSeaportTrade() | ||
292 | + SendPacket(actionCodes.Seaport_resetRpc, MsgPack.pack("")) | ||
293 | + return true | ||
294 | +end | ||
295 | + | ||
296 | +return _M |
src/actions/TowerAction.lua
@@ -109,7 +109,9 @@ function _M.endBattleRpc(agent, data) | @@ -109,7 +109,9 @@ function _M.endBattleRpc(agent, data) | ||
109 | 109 | ||
110 | curLevel = curLevel + 1 | 110 | curLevel = curLevel + 1 |
111 | reward, change = role:award(curTower.reward, {log = {desc = "towerBattle", int1 = id}}) | 111 | reward, change = role:award(curTower.reward, {log = {desc = "towerBattle", int1 = id}}) |
112 | - role:checkTaskEnter("TowerPass", {count = 1, type = towerType + 1}) | 112 | + if towerType == 0 then |
113 | + role:checkTaskEnter("TowerPass", {count = towerInfo.l}) | ||
114 | + end | ||
113 | end | 115 | end |
114 | 116 | ||
115 | if towerType == 0 then | 117 | if towerType == 0 then |
src/models/Role.lua
@@ -188,6 +188,8 @@ Role.schema = { | @@ -188,6 +188,8 @@ Role.schema = { | ||
188 | calTask = {"table", {}}, -- 英雄令活动 日历任务活动 | 188 | calTask = {"table", {}}, -- 英雄令活动 日历任务活动 |
189 | bcTask = {"table", {}}, -- 英雄令活动 日历任务活动 临时使用 | 189 | bcTask = {"table", {}}, -- 英雄令活动 日历任务活动 临时使用 |
190 | radioTask = {"table", {}}, -- 电台任务 {id = {time=end_ts,heros=heros}} 表crusadeCsv | 190 | radioTask = {"table", {}}, -- 电台任务 {id = {time=end_ts,heros=heros}} 表crusadeCsv |
191 | + | ||
192 | + seaport = {"table", {}}, -- 海岛贸易季 {time = 1234567890, donate = {}, collect = {[1] = {team = "1=2=3", time = 1234567890}}, shop = {}} | ||
191 | } | 193 | } |
192 | 194 | ||
193 | 195 | ||
@@ -418,6 +420,8 @@ function Role:data() | @@ -418,6 +420,8 @@ function Role:data() | ||
418 | calTask = self:getProperty("calTask"), | 420 | calTask = self:getProperty("calTask"), |
419 | bcTask = self:getProperty("bcTask"), | 421 | bcTask = self:getProperty("bcTask"), |
420 | radioTask = self:getProperty("radioTask"), | 422 | radioTask = self:getProperty("radioTask"), |
423 | + | ||
424 | + seaport = self:getProperty("seaport"), | ||
421 | } | 425 | } |
422 | end | 426 | end |
423 | 427 |
src/models/RoleLog.lua
@@ -135,6 +135,11 @@ local ItemReason = { | @@ -135,6 +135,11 @@ local ItemReason = { | ||
135 | --adv | 135 | --adv |
136 | chooseEvent = 1351, -- 冒险选择 | 136 | chooseEvent = 1351, -- 冒险选择 |
137 | clickTrader = 1352, -- 冒险商店 | 137 | clickTrader = 1352, -- 冒险商店 |
138 | + | ||
139 | + seaportDonate = 1400, -- 贸易港捐赠 | ||
140 | + seaportShop = 1401, -- 贸易港商店兑换 | ||
141 | + seaportReward = 1402, -- 贸易港阶段奖励 | ||
142 | + seaportTask = 1403, -- 贸易港任务奖励 | ||
138 | } | 143 | } |
139 | 144 | ||
140 | 145 |
src/models/RolePlugin.lua
@@ -1208,6 +1208,157 @@ function RolePlugin.bind(Role) | @@ -1208,6 +1208,157 @@ function RolePlugin.bind(Role) | ||
1208 | end | 1208 | end |
1209 | end | 1209 | end |
1210 | 1210 | ||
1211 | + -- 结算上期海港贸易季 | ||
1212 | + function Role:checkSeaportTrade() | ||
1213 | + local openTime0 = tonum(redisproxy:hget("autoincrement_set", "seaportTime0") or 0) | ||
1214 | + local openTime1 = tonum(redisproxy:hget("autoincrement_set", "seaportTime1") or 0) | ||
1215 | + local openTime2 = tonum(redisproxy:hget("autoincrement_set", "seaportTime2") or 0) | ||
1216 | + local seaport = self:getProperty("seaport") or {} | ||
1217 | + local oldTime = seaport.time or 0 | ||
1218 | + local update = false | ||
1219 | + | ||
1220 | + local function getReward(reset) | ||
1221 | + -- 全服捐赠奖励 | ||
1222 | + local donate = seaport.donate or {} | ||
1223 | + if not reset and (not donate[1] or not donate[2]) then | ||
1224 | + local result = self:getSeaportServerProgress() | ||
1225 | + local seaportCsv = csvdb["seaport_purchaseCsv"] | ||
1226 | + for idx, set in ipairs(seaportCsv) do | ||
1227 | + local done = true | ||
1228 | + for id, data in ipairs(set) do | ||
1229 | + if donate[id] or not result[idx] or not result[idx][id] or result[idx][id] < data.need_num then | ||
1230 | + done = false | ||
1231 | + break | ||
1232 | + end | ||
1233 | + end | ||
1234 | + if done then | ||
1235 | + update = true | ||
1236 | + self:award(set[1].phase_award, {log = {desc = "seaportReward", int1 = set[1].phase, int2 = set[1].id}}) | ||
1237 | + donate[idx] = 1 | ||
1238 | + end | ||
1239 | + end | ||
1240 | + seaport.donate = donate | ||
1241 | + end | ||
1242 | + | ||
1243 | + -- 委托任务的奖励 | ||
1244 | + local collect = seaport.collect or {} | ||
1245 | + if next(collect) then | ||
1246 | + local function getHeroCoef(hero, condition) | ||
1247 | + -- 基础概率 | ||
1248 | + local rareMap = {[HeroQuality.N] = 10, [HeroQuality.R] = 10, [HeroQuality.SR] = 15, [HeroQuality.SSR] = 20} | ||
1249 | + local rare = hero:getRare() | ||
1250 | + local result = 0 | ||
1251 | + for _, it in ipairs(condition:toTableArray(true)) do | ||
1252 | + local type = it[1] | ||
1253 | + local value = it[2] | ||
1254 | + local add = it[3] | ||
1255 | + if type == 1 then -- 种族加成 | ||
1256 | + if hero:getCamp() == value then | ||
1257 | + result = result + add | ||
1258 | + end | ||
1259 | + elseif type == 2 then -- 定位加成 | ||
1260 | + if hero:getPosition() == value then | ||
1261 | + result = result + add | ||
1262 | + end | ||
1263 | + end | ||
1264 | + end | ||
1265 | + | ||
1266 | + return result + (rareMap[rare] or 0) | ||
1267 | + end | ||
1268 | + | ||
1269 | + local carbonCsv = csvdb["idle_battleCsv"] | ||
1270 | + local expCarbonId = self:getProperty("hangInfo").expCarbonId | ||
1271 | + local coidCarbonId = self:getProperty("hangInfo").carbonId | ||
1272 | + local taskCsv = csvdb["seaport_taskCsv"] | ||
1273 | + local endTime = openTime0 + 86400 * 2 | ||
1274 | + for slot, set in pairs(taskCsv) do | ||
1275 | + if collect[slot] then | ||
1276 | + update = true | ||
1277 | + local level = collect[slot].level | ||
1278 | + local data = set[level] | ||
1279 | + local teams = collect[slot].team | ||
1280 | + local time = collect[slot].time | ||
1281 | + if time + data.time <= endTime then | ||
1282 | + if not carbonCsv[expCarbonId] or not carbonCsv[coidCarbonId] then break end | ||
1283 | + | ||
1284 | + local totalCoef = 0 | ||
1285 | + for _, heroId in ipairs(teams:toArray(true,"=")) do | ||
1286 | + local hero = self.heros[heroId] | ||
1287 | + if hero then | ||
1288 | + totalCoef = totalCoef + getHeroCoef(hero, data.success) | ||
1289 | + hero:addHeroFaith(data.trust) | ||
1290 | + end | ||
1291 | + end | ||
1292 | + | ||
1293 | + local bigSuccess = false | ||
1294 | + local result = math.randomInt(0, 100) | ||
1295 | + if result < totalCoef then | ||
1296 | + bigSuccess = true | ||
1297 | + end | ||
1298 | + | ||
1299 | + local money = math.ceil(carbonCsv[coidCarbonId].money / 5 * data.time * carbonCsv[coidCarbonId].money_clear) | ||
1300 | + local exp = math.ceil(carbonCsv[expCarbonId].exp / 5 * data.time * carbonCsv[expCarbonId].exp_clear) | ||
1301 | + local itemReward = data.item_clear_special:toNumMap() | ||
1302 | + itemReward[ItemId.Gold] = (itemReward[ItemId.Gold] or 0) + money | ||
1303 | + itemReward[ItemId.Exp] = (itemReward[ItemId.Exp] or 0) + exp | ||
1304 | + | ||
1305 | + if bigSuccess then | ||
1306 | + for key, value in pairs(itemReward) do | ||
1307 | + itemReward[key] = math.ceil(1.5 * value) | ||
1308 | + end | ||
1309 | + end | ||
1310 | + self:award(itemReward, {log = {desc = "seaportTask", int1 = slot, int2 = level}}) | ||
1311 | + end | ||
1312 | + end | ||
1313 | + end | ||
1314 | + end | ||
1315 | + seaport.collect = {} | ||
1316 | + | ||
1317 | + if update or reset then | ||
1318 | + if reset then | ||
1319 | + seaport = { | ||
1320 | + time = openTime0, | ||
1321 | + shop = {}, | ||
1322 | + collect = {}, | ||
1323 | + donate = {} | ||
1324 | + } | ||
1325 | + end | ||
1326 | + self:updateProperty({field = "seaport", value = seaport}) | ||
1327 | + end | ||
1328 | + end | ||
1329 | + | ||
1330 | + if oldTime == openTime0 then | ||
1331 | + if openTime1 == 1 or openTime2 == 1 then | ||
1332 | + return | ||
1333 | + end | ||
1334 | + getReward() | ||
1335 | + else | ||
1336 | + getReward(true) | ||
1337 | + end | ||
1338 | + end | ||
1339 | + | ||
1340 | + function Role:getSeaportServerProgress() | ||
1341 | + local result = {} | ||
1342 | + | ||
1343 | + local dataCsv = csvdb["seaport_purchaseCsv"] | ||
1344 | + local rediskey = {SEAPORT_TRADE_TASK_1,SEAPORT_TRADE_TASK_2} | ||
1345 | + for idx, set in ipairs(dataCsv) do | ||
1346 | + local temp = {} | ||
1347 | + temp = redisproxy:pipelining(function (red) | ||
1348 | + for id, data in ipairs(set) do | ||
1349 | + red:hget(rediskey[idx], id) | ||
1350 | + end | ||
1351 | + end) | ||
1352 | + result[idx] = {} | ||
1353 | + for i,v in ipairs(temp) do | ||
1354 | + if v then | ||
1355 | + result[idx][i] = tonumber(v) | ||
1356 | + end | ||
1357 | + end | ||
1358 | + end | ||
1359 | + return result | ||
1360 | + end | ||
1361 | + | ||
1211 | -- 获得激活的冒险效果 | 1362 | -- 获得激活的冒险效果 |
1212 | function Role:getAdvActiveSupportEffect() | 1363 | function Role:getAdvActiveSupportEffect() |
1213 | local effect = {} | 1364 | local effect = {} |
src/models/RoleTask.lua
@@ -191,7 +191,7 @@ local AchievListener = { | @@ -191,7 +191,7 @@ local AchievListener = { | ||
191 | [TaskType.OverOderTask] = {{14}}, | 191 | [TaskType.OverOderTask] = {{14}}, |
192 | [TaskType.FoodSellGold] = {{15, f("count")}}, | 192 | [TaskType.FoodSellGold] = {{15, f("count")}}, |
193 | [TaskType.DinerPopular] = {{16, f("count")}}, | 193 | [TaskType.DinerPopular] = {{16, f("count")}}, |
194 | - [TaskType.TowerPass] = {{17, f("count"), f("type")}}, | 194 | + [TaskType.TowerPass] = {{17, f("level")}}, |
195 | [TaskType.OpenBox] = {{18, f("count")}}, | 195 | [TaskType.OpenBox] = {{18, f("count")}}, |
196 | [TaskType.DinerLevelUp] = {{19, f("level"), f("type")}}, | 196 | [TaskType.DinerLevelUp] = {{19, f("level"), f("type")}}, |
197 | [TaskType.DinerTalentUp] = {{20, 1, f("type")}}, | 197 | [TaskType.DinerTalentUp] = {{20, 1, f("type")}}, |
@@ -493,6 +493,7 @@ function RoleTask.bind(Role) | @@ -493,6 +493,7 @@ function RoleTask.bind(Role) | ||
493 | [6] = true, | 493 | [6] = true, |
494 | [7] = true, | 494 | [7] = true, |
495 | [16] = true, | 495 | [16] = true, |
496 | + [17] = true, | ||
496 | [19] = true, | 497 | [19] = true, |
497 | [22] = true, | 498 | [22] = true, |
498 | [23] = true, | 499 | [23] = true, |
src/services/globald.lua
@@ -153,7 +153,36 @@ local function check_battle_act_close() | @@ -153,7 +153,36 @@ local function check_battle_act_close() | ||
153 | skynet.timeout(CHECK_BATTLE_ACT_CLOSE_INTERVAL, check_battle_act_close) | 153 | skynet.timeout(CHECK_BATTLE_ACT_CLOSE_INTERVAL, check_battle_act_close) |
154 | end | 154 | end |
155 | 155 | ||
156 | +-- @desc: 检查海港贸易开启、关闭 | ||
157 | +local function check_trade_seaport_status() | ||
158 | + local nowTime = skynet.timex() | ||
159 | + local nextTime = dayLater(nowTime) | ||
160 | + local interval = 100 * (nextTime - nowTime + 1) | ||
161 | + | ||
162 | + local curTm = os.date("*t", nowTime) | ||
163 | + if curTm.wday == 7 and curTm.hour >= 4 then -- 周六 | ||
164 | + local oldTime = tonumber(redisproxy:hget("autoincrement_set", "seaportTime0")) or 0 | ||
165 | + local cur4Time = specTime({hour = 4},nowTime) | ||
166 | + if cur4Time ~= oldTime then | ||
167 | + redisproxy:hset("autoincrement_set", "seaportTime0", cur4Time) | ||
168 | + redisproxy:hset("autoincrement_set", "seaportTime1", 1) | ||
169 | + redisproxy:del(SEAPORT_TRADE_TASK_1) | ||
170 | + redisproxy:del(SEAPORT_TRADE_TASK_2) | ||
171 | + end | ||
172 | + end | ||
173 | + if curTm.wday == 1 and curTm.hour >= 4 then -- 周日 | ||
174 | + if (tonumber(redisproxy:hget("autoincrement_set", "seaportTime1")) or 0) == 1 then | ||
175 | + redisproxy:hset("autoincrement_set", "seaportTime2", 1) | ||
176 | + end | ||
177 | + end | ||
178 | + if curTm.wday == 2 and curTm.hour >= 4 then -- 周一 | ||
179 | + -- redisproxy:hset("autoincrement_set", "seaportTime0", 0) | ||
180 | + redisproxy:hset("autoincrement_set", "seaportTime1", 0) | ||
181 | + redisproxy:hset("autoincrement_set", "seaportTime2", 0) | ||
182 | + end | ||
156 | 183 | ||
184 | + skynet.timeout(interval, check_trade_seaport_status) | ||
185 | +end | ||
157 | 186 | ||
158 | local CMD = {} | 187 | local CMD = {} |
159 | 188 | ||
@@ -178,6 +207,7 @@ end | @@ -178,6 +207,7 @@ end | ||
178 | function CMD.start() | 207 | function CMD.start() |
179 | check_mail_queue() | 208 | check_mail_queue() |
180 | --check_battle_act_close() | 209 | --check_battle_act_close() |
210 | + check_trade_seaport_status() | ||
181 | end | 211 | end |
182 | 212 | ||
183 | local function __init__() | 213 | local function __init__() |