local Diner = class("Diner", require("shared.ModelBase")) function Diner:ctor(properties) Diner.super.ctor(self, properties) end Diner.schema = { buildL = {"string", ""}, -- 家具等级 1=1 2=1 3=1 order = {"string", "[]"}, -- 特殊订单 sells = {"string", "[]"}, -- 贩卖位置 hot = {"string", ""}, -- 今日热门 dishTree = {"string", "1=1 2=1 3=1"}, -- 料理天赋 skillTree = {"string", ""}, -- 支援天赋 } function Diner:refreshDailyData(notify) -- 热门料理 local hotPool = {} local dishTree = self:getProperty("dishTree"):toNumMap() local hangPass = self.owner:getProperty("hangPass") for index, dishData in ipairs(csvdb["diner_dishCsv"]) do local check = true local dish = dishData[1] if dish.unlock_tree > 0 and not dishTree[dish.unlock_tree] then check = false end if dish.unlock_carbon > 0 and not hangPass[dish.unlock_carbon] then check = false end if check then table.insert(hotPool, index) end end if #hotPool >= 2 then local hot = "" for n = 1, 2 do local index = math.random(1, #hotPool) hot = hot:setv(hotPool[index], 1) table.remove(hotPool, index) end self:updateProperty({field = "hot", value = hot, notNotify = not notify}) self:setProperty("hot", hot) end -- 特殊订单 local order = {} end function Diner:updateProperty(params) params = params or {} if not self.schema[params.field] then return end local oldValue = self:getProperty(params.field) if params.value then self:setProperty(params.field, params.value) elseif params.delta then self:incrProperty(params.field, params.delta) else return end local newValue = self:getProperty(params.field) if not params.notNotify then self:notifyUpdateProperty(params.field, newValue, oldValue) end end function Diner:notifyUpdateProperty(field, newValue, oldValue) local datas = { key = field, newValue = newValue, oldValue = oldValue, } SendPacket(actionCodes.Diner_updateProperty, MsgPack.pack(datas)) end function Diner:updateSell(slot, calOnly) local sells = json.decode(self:getProperty("sells")) local sell = sells[slot] if not sell or sell.count <= 0 then return end local dishData = csvdb["diner_dishCsv"][sell.dish][sell.level] local deltaTime = 0 local deltaCount = 0 local timePass = skynet.timex() - sell.time local sellTime = dishData.sell_time if self:getProperty("hot"):getv(sell.dish, 0) > 0 then sellTime = sellTime * 1.5 end deltaCount = math.floor(timePass / sellTime) if deltaCount < sell.count then deltaTime = math.floor(timePass - sellTime * deltaCount) end deltaCount = math.min(deltaCount, sell.count) local lastCount = sell.count - deltaCount if not calOnly then sell.time = skynet.timex() - deltaTime sell.count = lastCount sell.level = self:getProperty("dishTree"):getv(sell.dish, 1) self:setProperty("sells", json.encode(sells)) end return { deltaCount = deltaCount, deltaTime = deltaTime, lastCount = lastCount, } end function Diner:getMaxSlots() local slotCount = globalCsv.diner_sell_slots_init local hangPass = self.owner:getProperty("hangPass") for _, carbonId in ipairs(globalCsv.diner_sell_slots_unlock) do if hangPass[carbonId] then slotCount = slotCount + 1 end end return slotCount end function Diner:getMaxDishs() local dishCount = globalCsv.diner_sell_dish_init local buildingCsv = csvdb["diner_buildingCsv"] for id, level in pairs(self:getProperty("buildL"):toNumMap()) do if buildingCsv[id][level].storage > 0 then dishCount = dishCount + buildingCsv[id][level].storage end end return dishCount end function Diner:data() local properties = {"buildL", "order", "sells", "hot", "dishTree", "skillTree"} local data = self:getProperties(properties) return data end return Diner