OOP Example: Cafe

Run Settings
LanguageLua
Language Version
Run Command
--[[ Order An order object that can be easily manipulated and hooked on to functions. ]] local Order = {} Order.__index = Order function Order.new(Customer, Items, Employee) local self = { Customer = Customer or "", Items = Items or {}, Employee = Employee or "", CompletedItems = {}, Status = Employee and "Processing" or "Unclaimed", Rating=0 } self.ChangedEvent = Instance.new("BindableEvent") self.Changed = self.ChangedEvent.Event setmetatable(self, Order) return self end function Order:Destroy() if self.ChangedEvent then self.ChangedEvent:Destroy() end for i,_ in pairs (self) do self[i]=nil end setmetatable(self,nil) self=nil end function Order:Assign(Employee) self.Employee = Employee self.ChangedEvent:Fire("Employee", Employee) end function Order:CompleteItem(itemName) local found for i,item in pairs (self.Items) do if item==itemName then found=item table.remove(self.Items,i) end end if not found then warn("No found item of name "..itemName) return end table.insert(self.CompletedItems, found) self.ChangedEvent:Fire("CompletedItems", found) end function Order:Rate(rating) self.Rating = rating self.ChangedEvent:Fire("Rating", rating) end function Order:Complete(callback) if self.Items>0 then warn("Order isn't completed") return false end self.Status = "Complete" self.ChangedEvent:Fire("Status", "Complete") --// Award employee, etc if callback then coroutine.wrap(callback)(self) end return true end return Order
--[[ Recipe Representation of steps needed to complete a recipe. For example, touching a water dispenser can can call :CompleteStep("Water") on the current recipe. When all steps has been completed, Recipe.Completed will fire. This can be connected to Order:CompleteItem() ]] local Recipe = {} Recipe.__index = Recipe Recipe.Recipes = { ["Americano"] = { "Coffee Beans", "Grind", "Water", }, ["Latte"] = { "Coffee Beans", "Grind", "Water", "Milk", }, } local function tablecopy (t) local nt = {} for i,v in pairs(t) do nt[i]=v end return nt end local function tablefind (t,value) for i,v in pairs(t) do if v==value then return i,v end end end function Recipe.new(recipeName, doesOrderMatter) assert(Recipe.Recipes[recipeName], "No recipe found of name "..recipeName) local self = { RecipeName = recipeName, Steps = tablecopy(Recipe.Recipes[recipeName]), CompletedSteps = {}, doesOrderMatter = doesOrderMatter or false } self.CompletedEvent = Instance.new("BindableEvent") self.Completed = self.CompletedEvent.Event setmetatable(self,Recipe) return self end function Recipe:CompleteStep(name) local order, step = tablefind(self.Steps,name) if step and (self.doesOrderMatter and order==1 or true) then --// Make sure the previous step has been completed, if order matters table.insert(self.CompletedSteps,name) else return end if #self.CompletedSteps == #self.Steps then self.CompletedEvent:Fire() end end function Recipe:Destroy() setmetatable(self,nil) self=nil end return Recipe
Editor Settings
Theme
Key bindings
Full width
Lines