local monitor = peripheral.find("monitor") monitor.setTextScale(0.5) monitor.clear() -- CONFIG: sliders local sliders = { {name="Throttle", value=0, side="front"}, {name="Yaw", value=0, side="left"}, {name="Pitch", value=0, side="right"}, {name="Lift", value=0, side="back"}, } local width, height = monitor.getSize() -- slider layout local sliderStartX = 2 local sliderWidth = width - 4 -- draw sliders local function draw() monitor.clear() for i, s in ipairs(sliders) do local y = i * 3 -- label monitor.setCursorPos(2, y) monitor.write(s.name .. " (" .. s.value .. ")") -- bar background monitor.setCursorPos(sliderStartX, y + 1) monitor.write(string.rep("-", sliderWidth)) -- filled portion local filled = math.floor((s.value / 15) * sliderWidth) monitor.setCursorPos(sliderStartX, y + 1) monitor.write(string.rep("#", filled)) end end -- update redstone outputs local function updateRedstone() for _, s in ipairs(sliders) do redstone.setAnalogOutput(s.side, s.value) end end -- convert click to slider value local function handleClick(x, y) for i, s in ipairs(sliders) do local sliderY = i * 3 + 1 if y == sliderY then local relative = math.max(0, math.min(sliderWidth, x - sliderStartX)) local value = math.floor((relative / sliderWidth) * 15) s.value = value end end end draw() updateRedstone() -- main loop while true do local event, side, x, y = os.pullEvent() if event == "monitor_touch" then handleClick(x, y) draw() updateRedstone() end end