From adbde60b10296004c853047333558b88f429a5c7 Mon Sep 17 00:00:00 2001 From: kay27 Date: Sat, 5 Feb 2022 06:27:23 +0400 Subject: [PATCH] #11 Spawn buds --- mods/ITEMS/mcl_amethyst/geode.lua | 6 +-- mods/ITEMS/mcl_amethyst/grow.lua | 77 ++++++++++++++++--------------- mods/ITEMS/mcl_amethyst/mod.conf | 2 +- 3 files changed, 45 insertions(+), 40 deletions(-) diff --git a/mods/ITEMS/mcl_amethyst/geode.lua b/mods/ITEMS/mcl_amethyst/geode.lua index 4b6b2c7b7..029d339cd 100644 --- a/mods/ITEMS/mcl_amethyst/geode.lua +++ b/mods/ITEMS/mcl_amethyst/geode.lua @@ -78,14 +78,14 @@ mcl_structures.register_structure({ }) local decrease_scan_area = 1 -local mapblock_opacity_placement_threshold = 0.9 +local mapblock_opacity_placement_threshold = 0.98 local threshold = math.floor(((mcl_mapgen.BS - 2 * decrease_scan_area)^3) * mapblock_opacity_placement_threshold) mcl_mapgen.register_mapgen_block(function(minp, maxp, blockseed) local y = minp.y if y < 0 then return end local pr = PseudoRandom(blockseed + 143) - if pr:next(120) ~= 54 then return end + if pr:next(1, 120) ~= 54 then return end local opacity_counter = #minetest.find_nodes_in_area(vector.add(minp, decrease_scan_area), vector.subtract(maxp, decrease_scan_area), "group:opaque") if opacity_counter < threshold then return end - place(minp, nil,pr) + place(minp, nil, pr) end) diff --git a/mods/ITEMS/mcl_amethyst/grow.lua b/mods/ITEMS/mcl_amethyst/grow.lua index 059fede5a..97d379ba2 100644 --- a/mods/ITEMS/mcl_amethyst/grow.lua +++ b/mods/ITEMS/mcl_amethyst/grow.lua @@ -1,49 +1,54 @@ local S = minetest.get_translator(minetest.get_current_modname()) -function mcl_amethyst.grow_amethyst_bud(pos, ignore_budding_amethyst) - local node = minetest.get_node(pos) +local interval = 10 +local chance = 5 + +local function grow(pos, node) local def = minetest.registered_nodes[node.name] - if not (def and def.groups and def.groups.amethyst_buds) then return end local next_gen = def._mcl_amethyst_next_grade if not next_gen then return end - -- Check Budding Amethyst - if not ignore_budding_amethyst then - local dir = minetest.wallmounted_to_dir(node.param2) - local ba_pos = vector.add(pos, dir) - local ba_node = minetest.get_node(ba_pos) - if ba_node.name ~= "mcl_amethyst:budding_amethyst_block" then return end - end + local dir = minetest.wallmounted_to_dir(node.param2) + local ba_pos = vector.add(pos, dir) + local ba_node = minetest.get_node(ba_pos) + if ba_node.name ~= "mcl_amethyst:budding_amethyst_block" then return end + local swap_result = table.copy(node) swap_result.name = next_gen minetest.swap_node(pos, swap_result) - return true end -local function get_growing_tool_handle(ignore) - return function(itemstack, user, pointed_thing) - if not user:is_player() then return end - local name = user:get_player_name() - local pos = minetest.get_pointed_thing_position(pointed_thing) - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - minetest.chat_send_player(name, S("Not allowed to use Amethyst Growing Tool in a protected area!")) - return - end - if not mcl_amethyst.grow_amethyst_bud(pos, ignore) then - minetest.chat_send_player(name, S("Growing Failed")) - end - end -end - -minetest.register_tool("mcl_amethyst:growing_tool",{ - description = S("Amethyst Growing Tool"), - on_use = get_growing_tool_handle(true), - on_place = get_growing_tool_handle(false), - inventory_image = "amethyst_cluster.png^amethyst_shard.png", - groups = { - tool = 1, - }, +minetest.register_abm({ + label = "Amethyst Bud Growth", + nodenames = {"group:amethyst_buds"}, + neighbors = {"mcl_amethyst:budding_amethyst_block"}, + interval = interval, + chance = chance, + action = grow, }) -mcl_wip.register_experimental_item("mcl_amethyst:growing_tool") +local all_directions = { + vector.new(1,0,0), + vector.new(0,1,0), + vector.new(0,0,1), + vector.new(-1,0,0), + vector.new(0,-1,0), + vector.new(0,0,-1), +} + +minetest.register_abm({ + label = "Spawn Amethyst Bud", + nodenames = {"mcl_amethyst:budding_amethyst_block"}, + neighbors = {"air", "group:water"}, + interval = 20, + chance = 2, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + if check_node_name ~= "air" and minetest.get_item_group(check_node_name, "water") == 0 then return end + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node = {name = "mcl_amethyst:medium_amethyst_bud", param2 = param2} + minetest.swap_node(check_pos, new_node) + end, +}) diff --git a/mods/ITEMS/mcl_amethyst/mod.conf b/mods/ITEMS/mcl_amethyst/mod.conf index 333117482..28215a743 100644 --- a/mods/ITEMS/mcl_amethyst/mod.conf +++ b/mods/ITEMS/mcl_amethyst/mod.conf @@ -1,5 +1,5 @@ name = mcl_amethyst -author = Emojiminetest +author = Emojiminetest, kay27 description = Amethyst related stuff for MCL5 depends = mcl_init, mcl_core, mcl_wip, mcl_mapgen, mcl_structures, mcl_blackstone optional_depends = mcl_spyglass, mcl_copper