From fc4a6a44ebfff75cbdf0a4b62b63d7b8b5f7eacc Mon Sep 17 00:00:00 2001 From: h-v-smacker Date: Mon, 7 May 2018 08:02:36 +0300 Subject: Resolution of API ambiguity --- api.txt | 31 +++++++++++++++++++++------ init.lua | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 97 insertions(+), 8 deletions(-) diff --git a/api.txt b/api.txt index bc450fd..e399bdc 100644 --- a/api.txt +++ b/api.txt @@ -14,7 +14,9 @@ Function Usage Adding Crops ------------ -bonemeal:add_crop({ nodename_start, growing_steps, seed_name }) +bonemeal:add_crop({ + { nodename_start, growing_steps, seed_name } +}) This command is used to add new crops for bonemeal to work on. @@ -29,7 +31,9 @@ bonemeal:add_crop({ Adding Saplings --------------- -bonemeal:add_sapling({ sapling_node, function, soil_type[sand, dirt, nodename] }) +bonemeal:add_sapling({ + { sapling_node, function, soil_type[sand, dirt, nodename] } +}) This command will add new saplings for bonemeal to grow on sand, soil or a specified node type. @@ -43,16 +47,31 @@ bonemeal:add_sapling({ Adding Dirt Decoration ---------------------- -bonemeal:add_deco({ dirt_node, {grass_node_list}, {decor_node_list} }) +bonemeal:add_deco({ + { dirt_node, {grass_node_list}, {decor_node_list} } +}) This command will add grass and decoration to specific dirt types, use "" to -add an empty node. +add an empty node. If some decorations have been already defined for this dirt type, new +will be added to the respective list. All empty ("") entries will be added regardless, +which allows to decrease the frequency of decoration emergence, if needed. e.g. -bonemeal:add_deco({"default:dirt_with_dry_grass", {"default:dry_grass_1", ""}, - {"flowers:rose", "flowers:viola"} }) +bonemeal:add_deco({ + {"default:dirt_with_dry_grass", {"default:dry_grass_1", ""}, + {"flowers:rose", "flowers:viola"} } +}) + +Thus, add_deco() always adds (to) a definition, and never overrides. To discard an existing +definiton in favor of the new one, use + +bonemeal:set_deco({ + { dirt_node, {grass_node_list}, {decor_node_list} } +}) +This command will set decoration for a given dirt type, fully replacing any existing definition. + Global ON_USE Function ---------------------- diff --git a/init.lua b/init.lua index f4f8f32..35526f8 100644 --- a/init.lua +++ b/init.lua @@ -290,13 +290,83 @@ end -- add grass and flower/plant decoration for specific dirt types -- {dirt_node, {grass_nodes}, {flower_nodes} -- e.g. {"default:dirt_with_dry_grass", dry_grass, flowers} +-- if an entry already exists for a given dirt type, it will add new entries and all empty +-- entries, allowing to both add decorations and decrease their frequency. function bonemeal:add_deco(list) - for n = 1, #list do - table.insert(deco, list[n]) + for l = 1, #list do + + for n = 1, #deco do + + -- update existing entry + if list[l][1] == deco[n][1] then + + -- adding grass types + for _,extra in ipairs(list[l][2]) do + if extra ~= "" then + for __,entry in ipairs(deco[n][2]) do + if extra == entry then + extra = false + break + end + end + end + if extra then + table.insert(deco[n][2], extra) + end + end + + -- adding decoration types + for _,extra in ipairs(list[l][3]) do + if extra ~= "" then + for __,entry in ipairs(deco[n][3]) do + if extra == entry then + extra = false + break + end + end + end + if extra then + table.insert(deco[n][3], extra) + end + end + + list[l] = false + break + end + + end + + if list[l] then + table.insert(deco, list[l]) + end + end end +-- definitively set a decration scheme +-- this function will either add a new entry as is, or replace the existing one +function bonemeal:set_deco(list) + + for l = 1, #list do + + for n = 1, #deco do + + -- replace existing entry + if list[l][1] == deco[n][1] then + deco[n][2] = list[l][2] + deco[n][3] = list[l][3] + list[l] = false + break + end + end + + if list[l] then + table.insert(deco, list[l]) + end + + end +end -- global on_use function for bonemeal function bonemeal:on_use(pos, strength, node) -- cgit v1.2.3