Commit 36204e3cf3a6005f1d45c66caf74292ce325888a

Authored by zhengshouren
1 parent 21419c7b

贩卖逻辑

src/actions/DinerAction.lua
... ... @@ -14,19 +14,62 @@ function _M.addSellRpc( agent, data )
14 14 if math.illegalNum(slot, 1, role.dinerData:getMaxSlots()) then
15 15 return
16 16 end
17   - if slot > role.dinerData:getMaxSlots() then
18   - return
19   - end
  17 + slot = tostring(slot)
  18 +
20 19 local dish = msg.dish
21 20 local dishSet = csvdb["diner_dishCsv"][dish]
22 21 if not dishSet then
23 22 return
24 23 end
  24 + local dishLevel = role.dinerData:getProperty("dishTree"):getv(dish, 0)
  25 + if dishLevel == 0 then
  26 + return
  27 + end
  28 + local dishData = dishSet[dishLevel]
  29 + if not dishData then
  30 + return
  31 + end
  32 +
  33 + local calSell = role.dinerData:updateSell(slot, true) or {
  34 + deltaCount = 0,
  35 + deltaTime = 0,
  36 + lastCount = 0,
  37 + }
25 38 local count = msg.count
26   - if math.illegalNum(count, 1, role.dinerData:getMaxDishs()) then
  39 + local maxDishCount = role.dinerData:getMaxDishs()
  40 + if math.illegalNum(count + calSell.lastCount, 1, maxDishCount) then
27 41 return
28 42 end
29 43  
  44 + local cost = dishData.material:toNumMap()
  45 + for _, n in pairs(cost) do
  46 + n = n * count
  47 + end
  48 + if not role:checkItemEnough(cost) then
  49 + return
  50 + end
  51 +
  52 + role:costItems(cost)
  53 + role.dinerData:updateSell(slot)
  54 +
  55 + local sells = json.decode(role.dinerData:getProperty("sells"))
  56 + if not sells[slot] then
  57 + sells[slot] = {
  58 + dish = dish,
  59 + level = dishLevel,
  60 + reward = "",
  61 + count = 0,
  62 + }
  63 + end
  64 + local sell = sells[slot]
  65 + sell.count = sell.count + count
  66 + sell.time = skynet.timex() - calSell.deltaTime
  67 + sell.hot = role.dinerData:getProperty("hot"):getv(sell.dish, 0)
  68 +
  69 + role.dinerData:updateProperty({field = "sells", value = json.encode(sells)})
  70 + SendPacket(actionCodes.Diner_addSellRpc, "")
  71 +
  72 + return true
30 73 end
31 74  
32 75 function _M.getSellRewardRpc( agent, data )
... ... @@ -54,7 +97,7 @@ function _M.levelUpRpc( agent, data )
54 97 return
55 98 end
56 99  
57   - role:costItems(cost, {})
  100 + role:costItems(cost)
58 101 role.dinerData:updateProperty({field = "level", value = buildL:setv(index, curLevel + 1)})
59 102  
60 103 SendPacket(actionCodes.Diner_levelUpRpc, '')
... ...
src/actions/HangAction.lua
... ... @@ -289,7 +289,7 @@ function _M.quickRpc(agent , data)
289 289 if not costs[curCount] then return end
290 290 if costs[curCount] > 0 then
291 291 if not role:checkItemEnough({[ItemId.Diamond] = costs[curCount]}) then return end
292   - role:costItems({[ItemId.Diamond] = costs[curCount]}, {})
  292 + role:costItems({[ItemId.Diamond] = costs[curCount]})
293 293 end
294 294  
295 295 role.dailyData:updateProperty({field = "hangQC", value = curCount})
... ...
src/actions/HeroAction.lua
... ... @@ -25,7 +25,7 @@ function _M.levelUpRpc( agent, data )
25 25 local curData = csvdb["unit_expCsv"][hero:getProperty("level")]
26 26 local cost = {[ItemId.Exp] = curData.exp, [ItemId.Gold] = curData.gold}
27 27 if not role:checkItemEnough(cost) then return end
28   - role:costItems(cost, {})
  28 + role:costItems(cost)
29 29 hero:updateProperty({field = "level", delta = 1})
30 30  
31 31 SendPacket(actionCodes.Hero_levelUpRpc, '')
... ... @@ -43,7 +43,7 @@ function _M.breakRpc( agent, data )
43 43 local curData = csvdb["unit_breakCsv"][hero:getProperty("breakL")]
44 44 local cost = {[ItemId.BreakCost] = curData.cost, [ItemId.Gold] = curData.gold}
45 45 if not role:checkItemEnough(cost) then return end
46   - role:costItems(cost, {})
  46 + role:costItems(cost)
47 47 hero:updateProperty({field = "breakL", delta = 1})
48 48  
49 49 SendPacket(actionCodes.Hero_breakRpc, '')
... ... @@ -62,7 +62,7 @@ function _M.wakeRpc(agent, data)
62 62 cost[ItemId.HeroFC[csvdb["unitCsv"][hero:getProperty("type")].rare]] = less[hero:getProperty("type")]
63 63 if not role:checkItemEnough(cost) then return end
64 64 end
65   - role:costItems(cost, {})
  65 + role:costItems(cost)
66 66 hero:updateProperty({field = "wakeL", delta = 1})
67 67  
68 68 SendPacket(actionCodes.Hero_wakeRpc, '')
... ... @@ -113,7 +113,7 @@ function _M.talentRpc(agent, data)
113 113 end
114 114  
115 115 if not role:checkItemEnough(cost) then return end
116   - role:costItems(cost, {})
  116 + role:costItems(cost)
117 117 talent = talent:incrv(index, 1)
118 118  
119 119 --是否进阶
... ... @@ -424,7 +424,7 @@ function _M.createHeroRpc(agent, data)
424 424 if hero:getProperty("type") == heroType then return end
425 425 end
426 426  
427   - role:costItems({[heroType] = cost}, {})
  427 + role:costItems({[heroType] = cost})
428 428 role:award({[heroType + ItemStartId.Hero] = 1}, {})
429 429  
430 430 SendPacket(actionCodes.Hero_createHeroRpc, "")
... ...
src/actions/RoleAction.lua
... ... @@ -256,7 +256,7 @@ function _M.saleItemRpc(agent, data)
256 256 if itemData.sell_effect == "" then return end
257 257 local sellEffect = itemData.sell_effect:toArray(true, "=")
258 258  
259   - role:costItems({[itemId] = count}, {})
  259 + role:costItems({[itemId] = count})
260 260 local reward = role:award({[sellEffect[1]] = sellEffect[2] * count}, {})
261 261  
262 262 SendPacket(actionCodes.Role_saleItemRpc, MsgPack.pack({reward = reward}))
... ... @@ -292,7 +292,7 @@ function _M.openItemRpc(agent, data)
292 292 end
293 293 end
294 294 end
295   - role:costItems({[itemId] = count}, {})
  295 + role:costItems({[itemId] = count})
296 296 reward = role:award(reward, {})
297 297  
298 298 SendPacket(actionCodes.Role_openItemRpc, MsgPack.pack({reward = reward}))
... ...
src/models/Diner.lua
... ... @@ -6,10 +6,10 @@ end
6 6  
7 7 Diner.schema = {
8 8 buildL = {"string", ""}, -- 家具等级 1=1 2=1 3=1
9   - order = {"string", ""}, -- 特殊订单
10   - slots = {"string", ""}, -- 贩卖位置
  9 + order = {"string", "[]"}, -- 特殊订单
  10 + sells = {"string", "[]"}, -- 贩卖位置
11 11 hot = {"string", ""}, -- 今日热门
12   - dishTree = {"string", ""}, -- 料理天赋
  12 + dishTree = {"string", "1=1 2=1 3=1"}, -- 料理天赋
13 13 skillTree = {"string", ""}, -- 支援天赋
14 14 }
15 15  
... ... @@ -76,13 +76,51 @@ function Diner:notifyUpdateProperty(field, newValue, oldValue)
76 76 SendPacket(actionCodes.Diner_updateProperty, MsgPack.pack(datas))
77 77 end
78 78  
79   -function Diner:doSell(notify)
80   -
  79 +function Diner:updateSell(slot, calOnly)
  80 + local sells = json.decode(self:getProperty("sells"))
  81 + local sell = sells[slot]
  82 + if not sell or sell.count <= 0 then
  83 + return
  84 + end
  85 + local dishData = csvdb["diner_dishCsv"][sell.dish][sell.level]
  86 +
  87 + local deltaTime = 0
  88 + local deltaCount = 0
  89 + local timePass = skynet.timex() - sell.time
  90 + local sellTime = dishData.sell_time
  91 + if self:getProperty("hot"):getv(sell.dish, 0) > 0 then
  92 + sellTime = sellTime * 1.5
  93 + end
  94 + deltaCount = math.floor(timePass / sellTime)
  95 + if deltaCount < sell.count then
  96 + deltaTime = math.floor(timePass - sellTime * deltaCount)
  97 + end
  98 + deltaCount = math.min(deltaCount, sell.count)
  99 + local lastCount = sell.count - deltaCount
  100 +
  101 + if not calOnly then
  102 + sell.time = skynet.timex() - deltaTime
  103 + sell.count = lastCount
  104 + sell.level = self:getProperty("dishTree"):getv(sell.dish, 1)
  105 +
  106 + self:setProperty("sells", json.encode(sells))
  107 + end
  108 + return {
  109 + deltaCount = deltaCount,
  110 + deltaTime = deltaTime,
  111 + lastCount = lastCount,
  112 + }
81 113 end
82 114  
83 115 function Diner:getMaxSlots()
84 116 local slotCount = globalCsv.diner_sell_slots_init
85 117  
  118 + local hangPass = self.owner:getProperty("hangPass")
  119 + for _, carbonId in ipairs(globalCsv.diner_sell_slots_unlock) do
  120 + if hangPass[carbonId] then
  121 + slotCount = slotCount + 1
  122 + end
  123 + end
86 124  
87 125 return slotCount
88 126 end
... ...
src/models/RolePlugin.lua
... ... @@ -191,8 +191,8 @@ function RolePlugin.bind(Role)
191 191 end
192 192  
193 193 function Role:costItems(itemCountT, params)
  194 + local pms = clone(params or {})
194 195 if itemCountT[ItemId.Diamond] then --优先扣除钻石
195   - local pms = clone(params or {})
196 196 pms.count = itemCountT[ItemId.Diamond]
197 197 if not self:costDiamond(pms) then
198 198 return
... ... @@ -200,7 +200,6 @@ function RolePlugin.bind(Role)
200 200 itemCountT[ItemId.Diamond] = nil
201 201 end
202 202 for itemId, count in pairs(itemCountT) do
203   - local pms = clone(params or {})
204 203 pms.itemId = itemId
205 204 pms.count = - count
206 205 self:addItem(pms)
... ...