Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- McDonald's V9 with redstone button press
- local mon = peripheral.wrap("monitor_14")
- local chest = peripheral.wrap("minecraft:chest_0")
- local redstoneSide = "back" -- Change this to the side your redstone is connected to
- mon.setTextScale(0.5)
- mon.setBackgroundColor(colors.white)
- mon.clear()
- local w, h = mon.getSize()
- local ordersPreparing = {}
- local ordersReady = {}
- local nextOrderId = 1
- local activeOrders = {}
- local prepTime = 2
- local maxBurgers = 64 * 27 * 2 -- 27 single chest, *2 for double
- -- Function to check if the depot is empty
- local function isDepotEmpty()
- return next(peripheral.wrap("create:depot_0").list()) == nil
- end
- -- Get hamburger stock
- local function getStock()
- local total = 0
- for _, item in pairs(chest.list()) do
- total = total + item.count
- end
- return total
- end
- local function drawStockBar()
- local stock = getStock()
- local barWidth = w
- local filledWidth = math.floor((stock / maxBurgers) * barWidth)
- local barY = h
- mon.setBackgroundColor(colors.white)
- mon.setTextColor(colors.black)
- mon.setCursorPos(1, barY)
- mon.write(string.rep(" ", barWidth))
- if filledWidth > 0 then
- mon.setBackgroundColor(colors.green)
- mon.setCursorPos(1, barY)
- mon.write(string.rep(" ", filledWidth))
- end
- local text = stock .. " burgers"
- local textX = 1 + math.floor((barWidth - #text) / 2)
- for i = 1, #text do
- local charX = textX + i - 1
- local char = text:sub(i, i)
- if charX <= filledWidth then
- mon.setBackgroundColor(colors.green)
- else
- mon.setBackgroundColor(colors.white)
- end
- mon.setCursorPos(charX, barY)
- mon.setTextColor(colors.black)
- mon.write(char)
- end
- mon.setBackgroundColor(colors.black)
- end
- local function drawBox(x1, y1, x2, y2, color)
- mon.setBackgroundColor(color)
- for y = y1, y2 do
- mon.setCursorPos(x1, y)
- mon.write(string.rep(" ", x2 - x1 + 1))
- end
- mon.setBackgroundColor(colors.white)
- end
- local function centerText(y, text, color)
- mon.setTextColor(color or colors.black)
- local x = math.floor((w - #text) / 2) + 1
- mon.setCursorPos(x, y)
- mon.write(text)
- end
- local lastStock = getStock()
- local function updateStock()
- local currentStock = getStock()
- if currentStock ~= lastStock then
- lastStock = currentStock
- drawStockBar()
- end
- end
- local stockTimer = os.startTimer(1)
- local function drawStaticUI()
- mon.clear()
- local logo = {
- " __ __ _____ _ _ _ ",
- " | \\/ | | __ \\ | | | ( ) ",
- " | \\ / | ___| | | | ___ _ __ __ _| | __| |/ ___ ",
- " | |\\/| |/ __| | | |/ _ \\| '_ \\ / _` | |/ _` | / __|",
- " | | | | (__| |__| | (_) | | | | (_| | | (_| | \\__ \\",
- " |_| |_|\\___|_____/ \\___/|_| |_|\\__,_|_|\\__,_| |___/"," "
- }
- local yOffset = 1
- for _, line in ipairs(logo) do
- centerText(yOffset, line, colors.black)
- yOffset = yOffset + 1
- end
- drawBox(2, 9, math.floor(w/2)-2, h-5, colors.red)
- drawBox(math.floor(w/2)+2, 9, w-2, h-5, colors.lime)
- local btnText = " Place Order "
- local btnX = math.floor((w - #btnText) / 2)
- local btnY = h - 3
- mon.setBackgroundColor(colors.orange)
- mon.setTextColor(colors.black)
- for y = btnY - 1, btnY + 1 do
- mon.setCursorPos(btnX - 1, y)
- mon.write(string.rep(" ", #btnText + 2))
- end
- mon.setCursorPos(btnX, btnY)
- mon.write(btnText)
- drawStockBar()
- end
- local function drawTable(x1, y1, x2, y2, color, title)
- mon.setBackgroundColor(color)
- mon.setTextColor(colors.black)
- for y = y1, y2 do
- mon.setCursorPos(x1, y)
- mon.write(string.rep(" ", x2 - x1 + 1))
- end
- local tableWidth = x2 - x1 + 1
- local titleX = x1 + math.floor((tableWidth - #title) / 2)
- mon.setCursorPos(titleX, y1)
- mon.write(title)
- end
- local function updateOrdersUI()
- local leftX1, leftY1 = 3, 10
- local leftX2, leftY2 = math.floor(w/2)-3, h-6
- local rightX1, rightY1 = math.floor(w/2)+3, 10
- local rightX2, rightY2 = w-3, h-6
- drawTable(leftX1, leftY1, leftX2, leftY2, colors.red, "Preparing")
- drawTable(rightX1, rightY1, rightX2, rightY2, colors.lime, "Collect")
- for i, order in ipairs(ordersPreparing) do
- mon.setBackgroundColor(colors.red)
- mon.setTextColor(colors.black)
- mon.setCursorPos(leftX1 + 1, leftY1 + i)
- local text = "Order #" .. order
- mon.write(text .. string.rep(" ", leftX2 - leftX1 - #text))
- end
- for i, order in ipairs(ordersReady) do
- mon.setBackgroundColor(colors.lime)
- mon.setTextColor(colors.black)
- mon.setCursorPos(rightX1 + 1, rightY1 + i)
- local text = "Order #" .. order
- mon.write(text .. string.rep(" ", rightX2 - rightX1 - #text))
- end
- drawStockBar()
- end
- local function addOrder()
- local thisOrder = nextOrderId
- nextOrderId = nextOrderId + 1
- table.insert(ordersPreparing, thisOrder)
- local prepTimer = os.startTimer(prepTime)
- activeOrders[prepTimer] = {id = thisOrder, stage = "preparing"}
- updateOrdersUI()
- end
- local function isInButton(x, y)
- local btnText = " Place Order "
- local btnX = math.floor((w - #btnText) / 2)
- local btnY = h - 3
- return x >= btnX - 1 and x <= btnX + #btnText and y >= btnY - 1 and y <= btnY + 1
- end
- drawStaticUI()
- updateOrdersUI()
- -- Start stock timer
- local stockTimer = os.startTimer(1)
- while true do
- local event, arg1, arg2, arg3 = os.pullEvent()
- if event == "monitor_touch" then
- local x, y = arg2, arg3
- if isInButton(x, y) then
- addOrder()
- end
- elseif event == "timer" then
- local timerId = arg1
- -- === Stock update timer ===
- if timerId == stockTimer then
- updateStock()
- stockTimer = os.startTimer(1) -- restart stock timer
- else
- local order = activeOrders[timerId]
- if order then
- -- Handle redstone pulse off
- if order.redstoneOff then
- redstone.setOutput(redstoneSide, false)
- activeOrders[timerId] = nil
- -- Preparing → Collect
- elseif order.stage == "preparing" then
- -- Remove from preparing table
- for i, o in ipairs(ordersPreparing) do
- if o == order.id then
- table.remove(ordersPreparing, i)
- break
- end
- end
- -- Add to ready table
- table.insert(ordersReady, order.id)
- updateOrdersUI()
- -- Trigger redstone pulse
- redstone.setOutput(redstoneSide, true)
- local pulseTimer = os.startTimer(1) -- must be >= 1
- activeOrders[pulseTimer] = {redstoneOff = true}
- -- Start "check depot" timer after 3s
- local checkTimer = os.startTimer(3)
- activeOrders[checkTimer] = {id = order.id, stage = "checkDepot"}
- activeOrders[timerId] = nil
- -- Check if depot is empty
- elseif order.stage == "checkDepot" then
- if isDepotEmpty() then
- -- Remove from ready table
- for i, o in ipairs(ordersReady) do
- if o == order.id then
- table.remove(ordersReady, i)
- break
- end
- end
- updateOrdersUI()
- activeOrders[timerId] = nil
- else
- -- Recheck after 1 second
- local retryTimer = os.startTimer(1)
- activeOrders[retryTimer] = {id = order.id, stage = "checkDepot"}
- activeOrders[timerId] = nil
- end
- end
- end
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment