Page 1 of 1

How to test for "air-like"node not filling the entire voxel?

PostPosted: Sun Jan 06, 2019 00:19
by michael314
I'm trying to write some code which tests if a block is air. But I have discovered that some blocks look like air even though they are not - for instance, grass_2. I do not know what these are called, but I need to treat any blocks that are air-like, that is, they have a block which isn't a cube which completely fills the voxel, the same as air.

How can I test for this?

Re: How to test for "air-like"node not filling the entire vo

PostPosted: Sun Jan 06, 2019 09:26
by Krock
In terms of light: Check against `sunlight_propagates = true` in the node definition
AFAIK all nodes which are smaller than 1x1x1m have this property to not look weird.

In terms of replacement: Check against `buildable_to = true` in the node definition. Those nodes are replaced when placing another node at the same spot.

If this solved your question, please add the [Solved] tag in front of your main post's title.

Re: How to test for "air-like"node not filling the entire vo

PostPosted: Thu Jan 10, 2019 12:56
by sorcerykid
Based on Krock's excellent answer, here's a quick function that will test if a node is airlike

Code: Select all
local function is_node_airlike( pos )
     local node = minetest.get_node( pos )
     return node ~= "ignore" and minetest.registered_nodes[ node.name ].sunlight_propagates == true
end


Afaik, this might not work with doors (I haven't tested, but it looks like sunlight_propagates is always true), so you would have to do another check for minetest.get_meta( pos ):get_int( "state" ) % 2 == 1 to ensure the door is actually open.

There are also some interesting corner cases with slabs and stairs (no pun intended), but I'll leave that as an exercise for you ;)

Re: How to test for "air-like"node not filling the entire vo

PostPosted: Wed Jan 16, 2019 04:55
by michael314
Thanks!

[Solved]How to test for "air-like"node not filling the entir

PostPosted: Wed Jan 16, 2019 05:02
by michael314
Krock wrote:If this solved your question, please add the [Solved] tag in front of your main post's title.


Sorry for being dense here, but... how do I do this? If I try to "edit" the main post, it ignores anything I try to type in the Subject line. I can edit the subject in *this* reply, but I'm not sure if that will do any good. (I'll try it here, if it works, disregard my question :-) Also, I can't really search very effectively for how to mark "solved" because I get lots of results of unrelated solved problems.

thanks!

Re: How to test for "air-like"node not filling the entire vo

PostPosted: Wed Jan 16, 2019 10:56
by rubenwardy
sorcerykid wrote:
Code: Select all
local function is_node_airlike( pos )
     local node = minetest.get_node( pos )
     return node ~= "ignore" and minetest.registered_nodes[ node.name ].sunlight_propagates == true
end


This won't work with unknown or aliased nodes.
The latter doesn't matter too much, but the former should be fixed by checking whether minetest.registered_nodes[ node.name ] is nil or not