added blockpredicate argument support

This commit is contained in:
gnembon committed 2020-11-29 19:34:40 -04:00
1 parent 3072b1ddad
commit d980ab6d91
2 files changed
+28 -3

No files matched your search

+14
View File
@@ -206,6 +206,20 @@ Here is a list of built-in types, with their return value formats, as well as a
* `'pos'`: block position as a triple of coordinates. Customized with `'loaded'`, if true requiring the position * `'pos'`: block position as a triple of coordinates. Customized with `'loaded'`, if true requiring the position
to be loaded. to be loaded.
* `'block'`: a valid block state wrapped in a block value (including block properties and data) * `'block'`: a valid block state wrapped in a block value (including block properties and data)
* `'blockpredicate`': returns a 4-tuple indicating conditions of a block to match: block name, block tag,
map of required state properties, and tag to match. Either block name or block tag are `null` but not both.
Property map is always specified, but its empty for no conditions, and matching nbt tag can be `null` indicating
no requirements. Technically the 'all-matching' predicate would be `[null, null, {}, null]`, but
block name or block tag is always specified. One can use the following routine to match a block agains this predicate:
```
block_to_match = block(x,y,z);
[block_name, block_tag, properties, nbt_tag] = block_predicate;
(block_name == null || block_name == block_to_match) &&
(block_tag == null || block_tags(block_to_match, block_tag)) &&
all(properties, block_state(block_to_match, _) == properties:_) &&
(!tag || tag_matches(block_data(block_to_match), tag))
```
* `'teamcolor'`: name of a team, and an integer color value of one of 16 valid team colors. * `'teamcolor'`: name of a team, and an integer color value of one of 16 valid team colors.
* `'columnpos'`: a pair of x and z coordinates. * `'columnpos'`: a pair of x and z coordinates.
* `'dimension'`: string representing a valid dimension in the world. * `'dimension'`: string representing a valid dimension in the world.
@@ -20,7 +20,7 @@ __config() -> {
'arguments'->{ 'arguments'->{
'center'->{'type'->'pos', 'loaded'->'true'}, 'center'->{'type'->'pos', 'loaded'->'true'},
'radius'->{'type'->'int', 'suggest'->[], 'min'->0},//to avoid default suggestions 'radius'->{'type'->'int', 'suggest'->[], 'min'->0},//to avoid default suggestions
'replacement'->{'type'->'block'}, 'replacement'->{'type'->'blockpredicate'},
'height'->{'type'->'int', 'suggest'->[],'min'->0}, 'height'->{'type'->'int', 'suggest'->[],'min'->0},
'orientation'->{'type'->'term', 'suggest'->['x','y','z']}, 'orientation'->{'type'->'term', 'suggest'->['x','y','z']},
'pointing'->{'type'->'term','suggest'->['up','down']}, 'pointing'->{'type'->'term','suggest'->['up','down']},
@@ -32,9 +32,20 @@ __config() -> {
//"Boilerplate" code //"Boilerplate" code
_block_matches(existing, block_predicate) ->
(
[name, block_tag, properties, nbt] = block_predicate;
(name == null || name == existing) &&
(block_tag == null || block_tags(existing, block_tag)) &&
all(properties, block_state(existing, _) == properties:_) &&
(!tag || tag_matches(block_data(existing), tag))
);
set_block(x, y, z, block, replacement)-> ( set_block(x, y, z, block, replacement)-> (
if(block != block(x, y, z), existing = block(x, y, z);
without_updates( if (set([x, y, z],block), if(block != existing && (replacement && _block_matches(existing, replacement) ),
without_updates( if (set(existing,block),
global_affected += [x, y, z]; global_affected += [x, y, z];
)); ));
); );