minetest_modding_book/_en/map/abms.md

69 lines
2.3 KiB
Markdown
Raw Normal View History

2014-12-15 23:04:40 +03:00
---
title: Active Block Modifiers
layout: default
2018-07-15 21:36:35 +03:00
root: ../..
2018-07-15 17:28:10 +03:00
idx: 3.2
description: Learn how to make ABMs to change blocks.
2018-07-15 21:13:16 +03:00
redirect_from: /en/chapters/abms.html
2014-12-15 23:04:40 +03:00
---
2015-02-22 13:28:37 +03:00
## Introduction
2014-12-15 23:04:40 +03:00
An **A**ctive **B**lock **M**odifier (**ABM**) allows you to run code on
certain nodes at specific intervals.
Please be warned, ABMs which are too frequent or act on many nodes
cause massive amounts of lag. Use them sparingly.
2014-12-15 23:04:40 +03:00
2017-08-29 14:17:21 +03:00
* [Example: Growing Alien Grass](#example-growing-alien-grass)
* [Your Turn](#your-turn)
## Example: Growing Alien Grass
2014-12-15 23:04:40 +03:00
Alien grass, for the purposes of this chapter, is a type of grass which
has a chance to appear near water.
2014-12-15 23:04:40 +03:00
To create it, you first need to register the grass, then
write an ABM.
2014-12-15 23:04:40 +03:00
```lua
2014-12-15 23:04:40 +03:00
minetest.register_node("aliens:grass", {
description = "Alien Grass",
2018-09-24 19:16:00 +03:00
light_source = 3, -- The node radiates light. Min 0, max 14
tiles = {"aliens_grass.png"},
groups = {choppy=1},
on_use = minetest.item_eat(20)
2014-12-15 23:04:40 +03:00
})
minetest.register_abm({
nodenames = {"default:dirt_with_grass"},
neighbors = {"default:water_source", "default:water_flowing"},
interval = 10.0, -- Run every 10 seconds
chance = 50, -- Select every 1 in 50 nodes
2018-09-24 19:16:00 +03:00
action = function(pos, node, active_object_count,
active_object_count_wider)
local pos = {x = pos.x, y = pos.y + 1, z = pos.z}
minetest.set_node(pos, {name = "aliens:grass"})
end
2014-12-15 23:04:40 +03:00
})
```
2014-12-15 23:04:40 +03:00
This ABM runs every ten seconds. There is a 1 in 5 chance of the ABM running on each
node that has the correct name and the correct neighbours. If the ABM runs on a
node, an alien grass node is placed above it. Please be warned, this will delete any
node previously located in that position. To prevent this you should include a check
using minetest.get_node to make sure there is space for the grass.
2014-12-15 23:04:40 +03:00
Specifying a neighbour is optional. If you specify multiple neighbours, only one of them
needs to be present to meet the requirements.
Specifying chance is also optional. If you don't specify the chance, the ABM will
always run when the other conditions are met.
2014-12-15 23:04:40 +03:00
2015-02-22 13:28:37 +03:00
## Your Turn
2014-12-15 23:04:40 +03:00
* **Midas touch**: Make water turn to gold blocks with a 1 in 100 chance, every 5 seconds.
* **Decay**: Make wood turn into dirt when water is a neighbour.
2014-12-15 23:04:40 +03:00
* **Burnin'**: Make every air node catch on fire. (Tip: "air" and "fire:basic_flame").
Warning: expect the game to crash.