Skip to content

Examples

Joachim Stolberg edited this page Jan 15, 2019 · 35 revisions

Simple Counter

Very simple example with output on the Controller menu.

init() code:

a = 1

loop() code:

a = a + 1
$print("a = ", a)

end

Hello World

"Hello world" example with output on the Display. Hello world

init() code:

a = Array("Hello", "world", "of", "Minetest")

$clear_screen("0669")

for i,text in a.next() do
    $display("0669", i+2, text)
end

Monitoring Chest & Furnace

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

Harvester Fuel Control

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

Idle Function

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

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.

Stopwatch

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

Balancer

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