-
Notifications
You must be signed in to change notification settings - Fork 17
Examples
- Simple Counter
- Hello World
- Monitoring Chest & Furnace
- Harvester Fuel Control
- Idle Function
- Stopwatch
- Balancer
Very simple example with output on the Controller menu.
init() code:
a = 1
loop() code:
a = a + 1
$print("a = ", a)
end
"Hello world" example with output on the Display.
init() code:
a = Array("Hello", "world", "of", "Minetest")
$clear_screen("0669")
for i,text in a.next() do
$display("0669", i+2, text)
end
More realistic example to output Pusher states on the Display
init() code:
DISPLAY = "1234"
min = 0
loop() code:
-- call code every 60 sec
if ticks % 60 == 0 then
-- output time in minutes
min = min + 1
$display(DISPLAY, 1, min, " min")
-- Cactus chest overrun
sts = $get_status("1034") -- read pusher status
if sts == "blocked" then $display(DISPLAY, 2, "Cactus full") end
-- Tree chest overrun
sts = $get_status("1089") -- read pusher status
if sts == "blocked" then $display(DISPLAY, 3, "Tree full") end
-- Furnace fuel empty
sts = $get_status("2895") -- read pusher status
if sts == "standby" then $display(DISPLAY, 4, "Furnace fuel") end
end
To pump only the necessary amount of fuel into the Harvester (or Quarry), the following script can be used:
init() code:
PUSHR = "0899"
HARVR = "0897"
-- to be on the safe side
$send_cmnd(PUSHR, "off")
pusher_on = false
loop() code:
- called every 30 second
if ticks % 30 == 0 then
if pusher_on then
pusher_on = false
-- stop pusher
$send_cmnd(PUSHR, "off")
-- restart harvester
$send_cmnd(HARVR, "on")
end
sts = $get_fuel_status(HARVR)
if sts == "empty" then
-- start pusher
$send_cmnd(PUSHR, "on")
pusher_on = true
end
end
This example shows, how Lua functions can be used. The function 'idle()' checks if a Pusher counter has changed since the last call. If not (Pusher is idle) the function returns true. This is normaly an indication for any fault in the TechPack plant.
init() code:
-- every 60 sec
$loopcycle(60)
DISPLAY = "0299"
-- define variable stores for the 3 pusher idle functions
s1 = Store()
s2 = Store()
s3 = Store()
function section:
-- 'number' is the Pusher number
-- 's' is a Store for the function variables
function idle(number, s)
cnt = $get_counter(number)
if cnt ~= s.get("cnt") then
-- store new counter value
s.set("cnt", cnt)
return false -- not idle
end
return true -- pusher is idle
end
loop() code:
-- clear row
$display(DISPLAY, 1, "")
if idle("0280", s1) then
$display(DISPLAY, 1, "Harv 1 is dle")
end
if idle("0285", s2) then
$display(DISPLAY, 1, "Harv 2 is idle")
end
if idle("0286", s3) then
$display(DISPLAY, 1, "Harv 3 is idle")
end
Stopwatch with highscore list, stored on the Server. You need the following nodes:
- SaferLua Controller
- SaferLua Battery
- SaferLua Server
- SmartLine Display
- SmartLine Player Detector
- SmartLine Button/Switch
You have to configure the Button/Switch as "switch" and configure the number of the SaferLua Controller to "connect" the switch with the Controller. When you turn on the switch, the time and the player name are taken. When you turn off the switch again, the time is calculated and the times of the best three players are shown on the Display.
init() code:
-- node numbers
DISPLAY = "0669"
SWITCH = "0670"
DETECTOR = "0671"
SERVER = "0674"
$events(true)
$loopcycle(0)
$clear_screen(DISPLAY)
-- read highscore data from Server, if available
-- otherwise generate a new 'Store'
highscore = $server_read(SERVER, "highscore") or Store()
loop() code:
if event then
if $get_input(SWITCH) == "on" then
time = $get_ms_time()
name = $playerdetector(DETECTOR)
$display(DISPLAY, 1, "running")
elseif $get_input(SWITCH) == "off" then
$display(DISPLAY, 1, "stopped")
time = $get_ms_time() - time
$display(DISPLAY, 2, "Time: ", time)
-- store the best (smallest) time only
time = math.min(highscore.get(name) or 999999, time)
highscore.set(name, time)
keys = highscore.keys("up")
-- output the top three with name and time
for i, name in keys.next() do
if i == 4 then break end
$display(DISPLAY, i+3, name, ": ", highscore.get(name) / 1000.0)
end
-- store results on the Server
$server_write(SERVER, "highscore", highscore)
end
end
The Autocrafter need one or more items depending on the recipe to craft the output. For example the rail recipe need 2 wood and 6 steel items to generate 18 rail items. This unequal ratio of items could lead to the situation that the Autocrafter inventory is full of wood but has no steel.
To prevent inventory overloads, the following "balancer" example can be used.
It reads the counters of the input Pushers to control the item flow ratio, which
in this case has to be 2:6
init() code:
-- tubelib numbers
IN_STEEL = "0761"
IN_WOOD = "0762"
-- Recipe: 6 steel + 2 wood gives 18 rails
NUM_STEEL = 6
NUM_WOOD = 2
MAX_DIFF = 10
$loopcycle(10)
-- Reset counter
$clear_counter(IN_STEEL)
$clear_counter(IN_WOOD)
loop() code:
-- read counters
cnt_steel = $get_counter(IN_STEEL)
cnt_wood = $get_counter(IN_WOOD)
$print("steel "..cnt_steel..", wood "..cnt_wood)
-- control ratio
if cnt_steel/NUM_STEEL > cnt_wood/NUM_WOOD + MAX_DIFF then
$send_cmnd(IN_STEEL, "off")
elseif cnt_wood/NUM_WOOD > cnt_steel/NUM_STEEL + MAX_DIFF then
$send_cmnd(IN_WOOD, "off")
else
$send_cmnd(IN_STEEL, "on")
$send_cmnd(IN_WOOD, "on")
end