parent
e8e16eee5d
commit
6622a49cd1
@ -13,11 +13,11 @@ In this chapter, you will learn how to perform basic actions on the map.
|
|||||||
|
|
||||||
- [Map Structure](#map-structure)
|
- [Map Structure](#map-structure)
|
||||||
- [Reading](#reading)
|
- [Reading](#reading)
|
||||||
- [Reading Nodes](#reading-nodes)
|
- [Reading Nodes](#reading-nodes)
|
||||||
- [Finding Nodes](#finding-nodes)
|
- [Finding Nodes](#finding-nodes)
|
||||||
- [Writing](#writing)
|
- [Writing](#writing)
|
||||||
- [Writing Nodes](#writing-nodes)
|
- [Writing Nodes](#writing-nodes)
|
||||||
- [Removing Nodes](#removing-nodes)
|
- [Removing Nodes](#removing-nodes)
|
||||||
- [Loading Blocks](#loading-blocks)
|
- [Loading Blocks](#loading-blocks)
|
||||||
- [Deleting Blocks](#deleting-blocks)
|
- [Deleting Blocks](#deleting-blocks)
|
||||||
|
|
||||||
@ -74,6 +74,10 @@ For example, say we wanted to make a certain type of plant that grows
|
|||||||
better near mese; you would need to search for any nearby mese nodes,
|
better near mese; you would need to search for any nearby mese nodes,
|
||||||
and adapt the growth rate accordingly.
|
and adapt the growth rate accordingly.
|
||||||
|
|
||||||
|
`minetest.find_node_near` will return the first found node in a certain radius
|
||||||
|
which matches the node names or groups given. In the following example,
|
||||||
|
we look for a mese node within 5 nodes of the position:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local grow_speed = 1
|
local grow_speed = 1
|
||||||
local node_pos = minetest.find_node_near(pos, 5, { "default:mese" })
|
local node_pos = minetest.find_node_near(pos, 5, { "default:mese" })
|
||||||
@ -84,7 +88,7 @@ end
|
|||||||
```
|
```
|
||||||
|
|
||||||
Let's say, for example, that the growth rate increases the more mese there is
|
Let's say, for example, that the growth rate increases the more mese there is
|
||||||
nearby. You should then use a function which can find multiple nodes in area:
|
nearby. You should then use a function that can find multiple nodes in the area:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local pos1 = vector.subtract(pos, { x = 5, y = 5, z = 5 })
|
local pos1 = vector.subtract(pos, { x = 5, y = 5, z = 5 })
|
||||||
@ -94,9 +98,9 @@ local pos_list =
|
|||||||
local grow_speed = 1 + #pos_list
|
local grow_speed = 1 + #pos_list
|
||||||
```
|
```
|
||||||
|
|
||||||
The above code doesn't quite do what we want, as it checks based on area, whereas
|
The above code finds the number of nodes in a *cuboid volume*. This is different
|
||||||
`find_node_near` checks based on range. In order to fix this, we will,
|
to `find_node_near`, which uses the distance to the position (ie: a *sphere*). In
|
||||||
unfortunately, need to manually check the range ourselves.
|
order to fix this, we will need to manually check the range ourselves:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local pos1 = vector.subtract(pos, { x = 5, y = 5, z = 5 })
|
local pos1 = vector.subtract(pos, { x = 5, y = 5, z = 5 })
|
||||||
@ -112,11 +116,11 @@ for i=1, #pos_list do
|
|||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
Now your code will correctly increase `grow_speed` based on mese nodes in range.
|
Now the code will correctly increase `grow_speed` based on mese nodes in range.
|
||||||
|
|
||||||
Note how we compared the squared distance from the position, rather than square
|
Note how we compared the squared distance from the position, rather than square
|
||||||
rooting it to obtain the actual distance. This is because computers find square
|
rooting it to obtain the actual distance. This is because computers find square
|
||||||
roots computationally expensive, so you should avoid them as much as possible.
|
roots computationally expensive, so they should avoided as much as possible.
|
||||||
|
|
||||||
There are more variations of the above two functions, such as
|
There are more variations of the above two functions, such as
|
||||||
`find_nodes_with_meta` and `find_nodes_in_area_under_air`, which work similarly
|
`find_nodes_with_meta` and `find_nodes_in_area_under_air`, which work similarly
|
||||||
@ -127,8 +131,8 @@ and are useful in other circumstances.
|
|||||||
### Writing Nodes
|
### Writing Nodes
|
||||||
|
|
||||||
You can use `set_node` to write to the map. Each call to set_node will cause
|
You can use `set_node` to write to the map. Each call to set_node will cause
|
||||||
lighting to be recalculated, which means that set_node is fairly slow for large
|
lighting to be recalculated and node callbacks to run, which means that set_node
|
||||||
numbers of nodes.
|
is fairly slow for large numbers of nodes.
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
minetest.set_node({ x = 1, y = 3, z = 4 }, { name = "default:mese" })
|
minetest.set_node({ x = 1, y = 3, z = 4 }, { name = "default:mese" })
|
||||||
@ -140,7 +144,7 @@ print(node.name) --> default:mese
|
|||||||
set_node will remove any associated metadata or inventory from that position.
|
set_node will remove any associated metadata or inventory from that position.
|
||||||
This isn't desirable in all circumstances, especially if you're using multiple
|
This isn't desirable in all circumstances, especially if you're using multiple
|
||||||
node definitions to represent one conceptual node. An example of this is the
|
node definitions to represent one conceptual node. An example of this is the
|
||||||
furnace node - whilst you think conceptually of it as one node, it's actually
|
furnace node - whilst you conceptually think of it as one node, it's actually
|
||||||
two.
|
two.
|
||||||
|
|
||||||
You can set a node without deleting metadata or the inventory like so:
|
You can set a node without deleting metadata or the inventory like so:
|
||||||
@ -160,7 +164,7 @@ minetest.remove_node(pos)
|
|||||||
minetest.set_node(pos, { name = "air" })
|
minetest.set_node(pos, { name = "air" })
|
||||||
```
|
```
|
||||||
|
|
||||||
In fact, remove_node will call set_node with the name being air.
|
In fact, remove_node is just a helper function that calls set_node with `"air"`.
|
||||||
|
|
||||||
## Loading Blocks
|
## Loading Blocks
|
||||||
|
|
||||||
@ -205,7 +209,8 @@ local function emerge_callback(pos, action,
|
|||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
This is not the only way of loading blocks; using an LVM will also cause the
|
This is not the only way of loading blocks; using an
|
||||||
|
[Lua Voxel Manipulator (LVM)](../advmap/lvm.html) will also cause the
|
||||||
encompassed blocks to be loaded synchronously.
|
encompassed blocks to be loaded synchronously.
|
||||||
|
|
||||||
## Deleting Blocks
|
## Deleting Blocks
|
||||||
|
Loading…
x
Reference in New Issue
Block a user