9 Commits

Author SHA1 Message Date
99d58e0876 add pl.generate_noise_params() 2023-04-16 19:24:52 +02:00
59c483fd4f support avoid_nodes 2023-04-13 21:15:34 +02:00
640cfd3ac7 improve near_nodes support 2023-04-13 14:15:10 +02:00
cdfbf20ab0 experimental near_nodes support 2023-04-12 21:54:22 +02:00
85569605f5 spawn some more plants directly 2023-04-12 21:03:22 +02:00
a154cb9904 disable some logging 2023-04-12 17:52:29 +02:00
d55f066686 support youngtrees 2023-04-12 17:34:48 +02:00
252c2bd1d2 add support for custom spawn functions 2023-04-12 17:00:18 +02:00
15f62452b8 some biome_lib replacement experiments 2023-04-12 14:12:51 +02:00
135 changed files with 2143 additions and 1308 deletions

View File

@ -1,13 +0,0 @@
name: luacheck
on: [push, pull_request]
jobs:
luacheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: apt
run: sudo apt-get install -y luarocks
- name: luacheck install
run: luarocks install --local luacheck
- name: luacheck run
run: $HOME/.luarocks/bin/luacheck ./

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*~

View File

@ -1,21 +1,14 @@
unused_args = false
allow_defined_top = true
max_line_length = 185
exclude_files = {".luacheckrc"}
globals = {
"biome_lib",
"bushes_classic",
}
read_globals = {
table = {fields = {"copy"}},
"minetest", "ItemStack",
"vector",
"default",
"moretrees",
"biome_lib",
"DIR_DELIM",
"minetest", "core",
"dump",
"vector", "nodeupdate",
"VoxelManip", "VoxelArea",
"PseudoRandom", "ItemStack",
"default",
}

View File

@ -1,5 +1,10 @@
-- 3D Mushroom mod by VanessaE
mushroom = {}
-- support for i18n
local S = minetest.get_translator("3dmushrooms")
minetest.override_item("flowers:mushroom_fertile_brown", {
drawtype = "mesh",
mesh = "3dmushrooms.obj",
@ -63,3 +68,5 @@ minetest.register_alias("mushroom:spore1", "flowers:mushroom_spores_red")
minetest.register_alias("mushroom:poison", "flowers:mushroom_red")
minetest.register_alias("mushroom:identifier", "default:mese_crystal_fragment")
minetest.log("info", S("[3D Mushrooms] loaded."))

View File

@ -0,0 +1,8 @@
# textdomain: 3dmushrooms
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# reusityback, 2022.
[3D Mushrooms] loaded.=[3D Mushrooms] geladen.

View File

@ -0,0 +1,8 @@
# textdomain: 3dmushrooms
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jolesh, 2022.
[3D Mushrooms] loaded.=[3D Mushrooms] ŝargis.

View File

@ -0,0 +1,8 @@
# textdomain: 3dmushrooms
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
[3D Mushrooms] loaded.=

View File

@ -1,2 +1,2 @@
name = 3dmushrooms
depends = flowers
depends = default, flowers

View File

@ -8,9 +8,14 @@
-- support for i18n
local S = minetest.get_translator("bushes")
abstract_bushes = {}
local bushes_bush_rarity = tonumber(minetest.settings:get("bushes_bush_rarity")) or 99.9
local bushes_bush_rarity_fertility = tonumber(minetest.settings:get("bushes_bush_rarity_fertility")) or 1.5
local bushes_youngtrees_rarity = tonumber(minetest.settings:get("bushes_youngtrees_rarity")) or 100
local bushes_youngtrees_rarity_fertility = tonumber(minetest.settings:get("bushes_youngtrees_rarity_fertility")) or 0.6
local bush_rarity = minetest.settings:get("bushes.bush_rarity") or 0.008
local youngtree_rarity = minetest.settings:get("youngtree.bush_rarity") or 0.006
minetest.register_node("bushes:youngtree2_bottom", {
description = S("Young Tree 2 (bottom)"),
@ -24,6 +29,7 @@ minetest.register_node("bushes:youngtree2_bottom", {
node_box = {
type = "fixed",
fixed = {
--{0.375000,-0.500000,-0.500000,0.500000,0.500000,-0.375000}, --NodeBox 1
{-0.0612,-0.500000,-0.500000,0.0612,0.500000,-0.375000}, --NodeBox 1
}
},
@ -32,10 +38,10 @@ minetest.register_node("bushes:youngtree2_bottom", {
drop = 'default:stick'
})
local BushBranchCenter = { {1,1}, {3,2} }
local BushBranchCenter = { {1,1}, {3,2} }
for i in pairs(BushBranchCenter) do
local Num = BushBranchCenter[i][1]
local TexNum = BushBranchCenter[i][2]
local Num = BushBranchCenter[i][1]
local TexNum = BushBranchCenter[i][2]
minetest.register_node("bushes:bushbranches"..Num, {
description = S("Bush Branches @1", Num),
drawtype = "nodebox",
@ -71,10 +77,10 @@ for i in pairs(BushBranchCenter) do
})
end
local BushBranchSide = { {2,1}, {4,2} }
local BushBranchSide = { {2,1}, {4,2} }
for i in pairs(BushBranchSide) do
local Num = BushBranchSide[i][1]
local TexNum = BushBranchSide[i][2]
local Num = BushBranchSide[i][1]
local TexNum = BushBranchSide[i][2]
minetest.register_node("bushes:bushbranches"..Num, {
description = S("Bush Branches @1", Num),
drawtype = "nodebox",
@ -116,7 +122,7 @@ for i in pairs(BushBranchSide) do
})
end
local BushLeafNode = { {1}, {2}}
local BushLeafNode = { {1}, {2}}
for i in pairs(BushLeafNode) do
local Num = BushLeafNode[i][1]
minetest.register_node("bushes:BushLeaves"..Num, {
@ -135,12 +141,44 @@ for i in pairs(BushLeafNode) do
})
end
local function grow_bush_node(pos, dir, leaf_type)
abstract_bushes.grow_bush = function(pos)
local leaf_type = math.random(1,2)
local bush_side_height = math.random(0,1)
local chance_of_bush_node_right = math.random(1,10)
if chance_of_bush_node_right> 5 then
local right_pos = {x=pos.x+1, y=pos.y+bush_side_height, z=pos.z}
abstract_bushes.grow_bush_node(right_pos,3,leaf_type)
end
local chance_of_bush_node_left = math.random(1,10)
if chance_of_bush_node_left> 5 then
bush_side_height = math.random(0,1)
local left_pos = {x=pos.x-1, y=pos.y+bush_side_height, z=pos.z}
abstract_bushes.grow_bush_node(left_pos,1,leaf_type)
end
local chance_of_bush_node_front = math.random(1,10)
if chance_of_bush_node_front> 5 then
bush_side_height = math.random(0,1)
local front_pos = {x=pos.x, y=pos.y+bush_side_height, z=pos.z+1}
abstract_bushes.grow_bush_node(front_pos,2,leaf_type)
end
local chance_of_bush_node_back = math.random(1,10)
if chance_of_bush_node_back> 5 then
bush_side_height = math.random(0,1)
local back_pos = {x=pos.x, y=pos.y+bush_side_height, z=pos.z-1}
abstract_bushes.grow_bush_node(back_pos,0,leaf_type)
end
abstract_bushes.grow_bush_node(pos,5,leaf_type)
end
abstract_bushes.grow_bush_node = function(pos,dir, leaf_type)
local right_here = {x=pos.x, y=pos.y+1, z=pos.z}
local above_right_here = {x=pos.x, y=pos.y+2, z=pos.z}
local bush_branch_type = 2
-- MM: I'm not sure if it's slower now than before...
if dir ~= 5 and leaf_type == 1 then
bush_branch_type = 2
end
@ -156,108 +194,52 @@ local function grow_bush_node(pos, dir, leaf_type)
dir = 1
end
local nodename = minetest.get_node(right_here).name
if nodename == "air" or nodename == "default:junglegrass" then -- instead of check_air = true,
if minetest.get_node(right_here).name == "air" -- instead of check_air = true,
or minetest.get_node(right_here).name == "default:junglegrass" then
minetest.swap_node(right_here, {name="bushes:bushbranches"..bush_branch_type , param2=dir})
--minetest.chat_send_all("leaf_type: (" .. leaf_type .. ")")
minetest.swap_node(above_right_here, {name="bushes:BushLeaves"..leaf_type})
local chance_of_high_leaves = math.random(1,10)
if chance_of_high_leaves > 5 then
if chance_of_high_leaves> 5 then
local two_above_right_here = {x=pos.x, y=pos.y+3, z=pos.z}
--minetest.chat_send_all("leaf_type: (" .. leaf_type .. ")")
minetest.swap_node(two_above_right_here, {name="bushes:BushLeaves"..leaf_type})
end
end
end
local function grow_bush(pos)
-- replace possible grass nodes
minetest.swap_node({x=pos.x, y=pos.y+1, z=pos.z}, {name="air"})
local leaf_type = math.random(1,2)
local bush_side_height = math.random(0,1)
pl.register_on_generate({
surface = {
"default:dirt_with_grass",
"stoneage:grass_with_silex",
"sumpf:peat",
"sumpf:sumpf"
},
noise_params = pl.generate_noise_params({rarity = bushes_bush_rarity, rarity_fertility = bushes_bush_rarity_fertility}),
min_elevation = 1, -- above sea level
},
"bushes:bushes",
abstract_bushes.grow_bush
)
local chance_of_bush_node_right = math.random(1,10)
if chance_of_bush_node_right > 5 then
local right_pos = {x=pos.x+1, y=pos.y+bush_side_height, z=pos.z}
grow_bush_node(right_pos,3,leaf_type)
end
local chance_of_bush_node_left = math.random(1,10)
if chance_of_bush_node_left > 5 then
local left_pos = {x=pos.x-1, y=pos.y+bush_side_height, z=pos.z}
grow_bush_node(left_pos,1,leaf_type)
end
local chance_of_bush_node_front = math.random(1,10)
if chance_of_bush_node_front > 5 then
local front_pos = {x=pos.x, y=pos.y+bush_side_height, z=pos.z+1}
grow_bush_node(front_pos,2,leaf_type)
end
local chance_of_bush_node_back = math.random(1,10)
if chance_of_bush_node_back > 5 then
local back_pos = {x=pos.x, y=pos.y+bush_side_height, z=pos.z-1}
grow_bush_node(back_pos,0,leaf_type)
end
grow_bush_node(pos,5,leaf_type)
abstract_bushes.grow_youngtree2 = function(pos)
local height = math.random(4,5)
abstract_bushes.grow_youngtree_node2(pos,height)
end
minetest.register_decoration({
name = "bushes:bush",
decoration = {
"air"
},
fill_ratio = bush_rarity,
y_min = 1,
y_max = 40,
place_on = {
"default:dirt_with_grass",
"stoneage:grass_with_silex",
"sumpf:peat",
"sumpf:sumpf"
},
deco_type = "simple",
flags = "all_floors",
})
--[[
this is purposefully wrapped in a on mods loaded callback to that it gets the proper ids
if other mods clear the registered decorations
]]
local did
minetest.register_on_mods_loaded(function()
did = minetest.get_decoration_id("bushes:bush")
minetest.set_gen_notify("decoration", {did})
end)
minetest.register_on_generated(function(minp, maxp, blockseed)
local g = minetest.get_mapgen_object("gennotify")
local locations = {}
local deco_locations = g["decoration#" .. did] or {}
for _, pos in pairs(deco_locations) do
locations[#locations+1] = pos
end
if #locations == 0 then return end
for _, pos in ipairs(locations) do
grow_bush(pos)
end
end)
local function grow_youngtree_node2(pos, height)
abstract_bushes.grow_youngtree_node2 = function(pos, height)
local right_here = {x=pos.x, y=pos.y+1, z=pos.z}
local above_right_here = {x=pos.x, y=pos.y+2, z=pos.z}
local two_above_right_here = {x=pos.x, y=pos.y+3, z=pos.z}
local three_above_right_here = {x=pos.x, y=pos.y+4, z=pos.z}
local nodename = minetest.get_node(right_here).name
if nodename == "air" or nodename == "default:junglegrass" then -- instead of check_air = true,
if minetest.get_node(right_here).name == "air" -- instead of check_air = true,
or minetest.get_node(right_here).name == "default:junglegrass" then
if height == 4 then
local two_above_right_here_south = {x=pos.x, y=pos.y+3, z=pos.z-1}
local three_above_right_here_south = {x=pos.x, y=pos.y+4, z=pos.z-1}
minetest.swap_node(right_here, {name="bushes:youngtree2_bottom"})
minetest.swap_node(above_right_here, {name="bushes:youngtree2_bottom"})
minetest.swap_node(two_above_right_here, {name="bushes:bushbranches2" , param2=2})
@ -268,52 +250,17 @@ local function grow_youngtree_node2(pos, height)
end
end
local function grow_youngtree2(pos)
local height = math.random(4,5)
grow_youngtree_node2(pos,height)
end
minetest.register_decoration({
name = "bushes:youngtree",
decoration = {
"air"
pl.register_on_generate({
surface = {
"default:dirt_with_grass",
"stoneage:grass_with_silex",
"sumpf:peat",
"sumpf:sumpf"
},
noise_params = pl.generate_noise_params({rarity = bushes_youngtrees_rarity, rarity_fertility = bushes_youngtrees_rarity_fertility}),
min_elevation = 1, -- above sea level
},
fill_ratio = youngtree_rarity,
y_min = 1,
y_max = 40,
place_on = {
"default:dirt_with_grass",
"stoneage:grass_with_silex",
"sumpf:peat",
"sumpf:sumpf"
},
deco_type = "simple",
flags = "all_floors",
})
--[[
this is purposefully wrapped in a on mods loaded callback to that it gets the proper ids
if other mods clear the registered decorations
]]
local did2
minetest.register_on_mods_loaded(function()
did2 = minetest.get_decoration_id("bushes:youngtree")
minetest.set_gen_notify("decoration", {did2})
end)
minetest.register_on_generated(function(minp, maxp, blockseed)
local g = minetest.get_mapgen_object("gennotify")
local locations = {}
local deco_locations = g["decoration#" .. did2] or {}
for _, pos in pairs(deco_locations) do
locations[#locations+1] = pos
end
if #locations == 0 then return end
for _, pos in ipairs(locations) do
grow_youngtree2(pos)
end
end)
minetest.log("action", "[bushes] loaded.")
"bushes:youngtrees",
abstract_bushes.grow_youngtree2
)

View File

@ -1,4 +1,10 @@
# textdomain: bushes
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
Young Tree 2 (bottom)=Strauch 2 (Ansatz)
Bush Branches @1=Buschäste @1
Bush Leaves @1=Buschblätter @1

View File

@ -1,4 +1,10 @@
# textdomain: bushes
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jolesh, 2022.
Young Tree 2 (bottom)=Juna Arbo 2 (malsupro)
Bush Branches @1=Arbustaj Branĉoj @1
Bush Leaves @1=Arbustaj Folioj @1

View File

@ -1,4 +1,11 @@
# textdomain: bushes
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# fat115 <fat115@framasoft.org>, 2017.
#
Young Tree 2 (bottom)=Arbuste 2 (bas)
Bush Branches @1=Branches de buisson @1
Bush Leaves @1=Feuilles de buisson @1

View File

@ -1,4 +1,10 @@
# textdomain: bushes
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
Young Tree 2 (bottom)=
Bush Branches @1=
Bush Leaves @1=

View File

@ -1,4 +1,3 @@
name = bushes
title = Bushes
depends = default
optional_depends = stoneage, sumpf, ebiomes
depends = default, biome_lib
optional_depends = stoneage, sumpf

View File

@ -1,5 +1,17 @@
# Bush rarity (higher number -> higher probability)
bushes.bush_rarity (Bush rarity) float 0.008 0.0001 1
#Bush rarity %
bushes_bush_rarity (Bush rarity %) float 99.9 0 100
# Youngtree rarity (higher number -> higher probability)
bushes.youngtree_rarity (Youngtree rarity) float 0.006 0.0001 1
#How much the rarity is reduced by fertility %
bushes_bush_rarity_fertility (Bush rarity fertility reduction %) float 1.5 0 100
#Bush minimum fertility (-1 to +1)
bushes_bush_fertility (Bush minimum fertility) float -0.7 -1 1
#Youngtree (from bushes mod) rarity %
bushes_youngtrees_rarity (Youngtree bush rarity %) float 100 0 100
#How much the rarity is reduced by fertility %
bushes_youngtrees_rarity_fertility (Youngtree bush rarity fertility reduction %) float 0.6 0 100
#Youngtree (from bushes mod) minimum fertility (-1 to +1)
bushes_youngtrees_fertility (Youngtree bush minimum fertility) float -0.5 -1 1

View File

@ -33,12 +33,9 @@ end
-- override farming_plus strawberry and add food_ group
if minetest.get_modpath("farming_plus") then
local groups = table.copy(minetest.registered_items["farming_plus:strawberry_item"].groups)
groups["food_strawberry"] = 1
groups["food_berry"] = 1
minetest.override_item("farming_plus:strawberry_item", {
groups = groups,
groups = {food_strawberry = 1, food_berry = 1, flammable = 2},
})
end

View File

@ -7,7 +7,7 @@ bushes_classic = {}
local S = minetest.get_translator("bushes_classic")
bushes_classic.bushes = {
"strawberry",
"strawberry",
"blackberry",
"blueberry",
"raspberry",
@ -30,19 +30,12 @@ local modpath = minetest.get_modpath('bushes_classic')
dofile(modpath..'/cooking.lua')
dofile(modpath..'/nodes.lua')
local spawn_plants = bushes_classic.spawn_list
local function get_biome_data(pos, perlin_fertile)
local fertility = perlin_fertile:get_2d({x=pos.x, y=pos.z})
local data = minetest.get_biome_data(pos)
-- Original values this method returned were +1 (lowest) to -1 (highest)
-- so we need to convert the 0-100 range from get_biome_data() to that.
return fertility, 1 - (data.heat / 100 * 2), 1 - (data.humidity / 100 * 2)
end
minetest.register_abm({
nodenames = {
biome_lib.register_active_spawner({
spawn_delay = 3600,
spawn_plants = bushes_classic.spawn_list,
avoid_radius = 10,
spawn_chance = 100,
spawn_surfaces = {
"default:dirt_with_grass",
"woodsoils:dirt_with_leaves_1",
"woodsoils:grass_with_leaves_1",
@ -50,31 +43,16 @@ minetest.register_abm({
"farming:soil",
"farming:soil_wet"
},
interval = 3600,
chance = 100,
label = "[bushes_classic] spawn bushes",
min_y = -16,
max_y = 48,
action = function(pos, node)
local p_top = {x = pos.x, y = pos.y + 1, z = pos.z}
local n_top = minetest.get_node_or_nil(p_top)
if not n_top or n_top.name ~= "air" then return end
local perlin_fertile_area = minetest.get_perlin(545342534, 3, 0.6, 100)
local fertility, temperature, humidity = get_biome_data(pos, perlin_fertile_area)
local pos_biome_ok = fertility > -0.1 and temperature <= 0.15 and temperature >= -0.15 and humidity <= 0 and humidity >= -1
if not pos_biome_ok then return end
if minetest.find_node_near(p_top, 10 + math.random(-1.5,2), {"group:bush"}) then
return -- Nodes to avoid are nearby
end
local plant_to_spawn = spawn_plants[math.random(1, #spawn_plants)]
minetest.swap_node(p_top, {name = plant_to_spawn, param2 = 0})
end
avoid_nodes = {"group:bush"},
seed_diff = 545342534, -- chosen by a fair mashing of the keyboard - guaranteed to be random :P
plantlife_limit = -0.1,
light_min = 10,
temp_min = 0.15, -- approx 20C
temp_max = -0.15, -- approx 35C
humidity_min = 0, -- 50% RH
humidity_max = -1, -- 100% RH
})
minetest.register_alias("bushes:basket_pies", "bushes:basket_strawberry")
print("[Bushes] Loaded.")

View File

@ -1,39 +1,46 @@
# textdomain: bushes_classic
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Xanthin, 2017.
#
Sugar=Zucker
Strawberry=Erdbeere
Raw Strawberry pie=Rohe Erdbeertorte
Cooked Strawberry pie=Erdbeertorte
Slice of Strawberry pie=Erdbeertortenstück
Basket with Strawberry pies=Korb mit Erdbeertorten
Cooked Strawberry pie=Erdbeertorte
Raw Strawberry pie=Rohe Erdbeertorte
Slice of Strawberry pie=Erdbeertortenstueck
Strawberry=Erdbeere
Strawberry Bush=Erdbeerbusch
Blackberry=Brombeere
Raw Blackberry pie=Rohe Brombeertorte
Cooked Blackberry pie=Brombeertorte
Slice of Blackberry pie=Brombeertortenstück
Basket with Blackberry pies=Korb mit Brombeertorten
Blackberry=Brombeere
Blackberry Bush=Brombeerbusch
Blueberry=Blaubeere
Raw Blueberry pie=Rohe Blaubeertorte
Cooked Blueberry pie=Blaubeertorte
Slice of Blueberry pie=Blaubeertortenstück
Cooked Blackberry pie=Brombeertorte
Raw Blackberry pie=Rohe Brombeertorte
Slice of Blackberry pie=Brombeertortenstueck
Basket with Blueberry pies=Korb mit Blaubeertorten
Blueberry=Blaubeere
Blueberry Bush=Blaubeerbusch
Raspberry=Himbeere
Raw Raspberry pie=Rohe Himbeertorte
Cooked Raspberry pie=Himbeertorte
Slice of Raspberry pie=Himbeertortenstück
Cooked Blueberry pie=Blaubeertorte
Raw Blueberry pie=Rohe Blaubeertorte
Slice of Blueberry pie=Blaubeertortenstueck
Basket with Raspberry pies=Korb mit Himbeertorten
Cooked Raspberry pie=Himbeertorte
Raspberry=Himbeere
Raspberry Bush=Himbeerbusch
Gooseberry=Stachelbeere
Raw Gooseberry pie=Rohe Stachelbeertorte
Cooked Gooseberry pie=Stachelbeertorte
Slice of Gooseberry pie=Stachelbeertortenstück
Raw Raspberry pie=Rohe Himbeertorte
Slice of Raspberry pie=Himbeertortenstueck
Basket with Gooseberry pies=Korb mit Stachelbeertorten
Cooked Gooseberry pie=Stachelbeertorte
Gooseberry=Stachelbeere
Gooseberry Bush=Stachelbeerbusch
Raw Gooseberry pie=Rohe Stachelbeertorte
Slice of Gooseberry pie=Stachelbeertortenstueck
Basket with Mixed Berry pies=Korb mit Beerenmixtorten
Cooked Mixed Berry pie=Beerenmixtorte
Currently fruitless Bush=zur Zeit fruechteloser
Mixed Berry=Beerenmix
Raw Mixed Berry pie=Rohe Beerenmixtorte
Cooked Mixed Berry pie=Beerenmixtorte
Slice of Mixed Berry pie=Beerenmixtortenstück
Basket with Mixed Berry pies=Korb mit Beerenmixtorten
Currently fruitless Bush=Zur Zeit früchteloser Busch
Slice of Mixed Berry pie=Beerenmixtortenstueck
Basket=Korb

View File

@ -1,39 +1,46 @@
# textdomain: bushes_classic
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jolesh, 2022.
#
Sugar=Sukero
Strawberry=Frago
Raw Strawberry pie=Kruda Fragokuko
Cooked Strawberry pie=Kuirita Fragokuko
Slice of Strawberry pie=Tranĉaĵo de Fragokuko
Basket with Strawberry pies=Korbo kun Fragokukoj
Cooked Strawberry pie=Kuirita Fragokuko
Raw Strawberry pie=Kruda Fragokuko
Slice of Strawberry pie=Tranĉaĵo de Fragokuko
Strawberry=Frago
Strawberry Bush=Fraga Arbusto
Blackberry=Rubuso
Raw Blackberry pie=Kruda Rubusokuko
Cooked Blackberry pie=Kuirita Rubusokuko
Slice of Blackberry pie=Tranĉaĵo de Rubusokuko
Basket with Blackberry pies=Korbo kun Rubusokukoj
Cooked Blackberry pie=Kuirita Rubusokuko
Raw Blackberry pie=Kruda Rubusokuko
Slice of Blackberry pie=Tranĉaĵo de Rubusokuko
Blackberry=Rubuso
Blackberry Bush=Rubusa Arbusto
Blueberry=Mirtelo
Raw Blueberry pie=Kruda Mirtelokuko
Cooked Blueberry pie=Kuirita Mirtelokuko
Slice of Blueberry pie=Tranĉaĵo de Mirtelokuko
Basket with Blueberry pies=Korbo kun Mirtelokukoj
Blueberry=Mirtelo
Blueberry Bush=Mirtela Arbusto
Raspberry=Frambo
Raw Raspberry pie=Kruda Frambokuko
Cooked Raspberry pie=Kuirita Frambokuko
Slice of Raspberry pie=Tranĉaĵo de Frambokuko
Cooked Blueberry pie=Kuirita Mirtelokuko
Raw Blueberry pie=Kruda Mirtelokuko
Slice of Blueberry pie=Tranĉaĵo de Mirtelokuko
Basket with Raspberry pies=Korbo kun Frambokukoj
Cooked Raspberry pie=Kuirita Frambokuko
Raspberry=Frambo
Raspberry Bush=Framba Arbusto
Gooseberry=Grosbero
Raw Gooseberry pie=Kruda Grosberkuko
Cooked Gooseberry pie=Kuirita Grosberkuko
Slice of Gooseberry pie=Tranĉaĵo de Grosberkuko
Raw Raspberry pie=Kruda Frambokuko
Slice of Raspberry pie=Tranĉaĵo de Frambokuko
Basket with Gooseberry pies=Korbo kun Grosberkuko
Cooked Gooseberry pie=Kuirita Grosberkuko
Gooseberry=Grosbero
Gooseberry Bush=Grosberarbusto
Raw Gooseberry pie=Kruda Grosberkuko
Slice of Gooseberry pie=Tranĉaĵo de Grosberkuko
Basket with Mixed Berry pies=Korbo kun Miksitaj Beraj Kukoj
Cooked Mixed Berry pie=Kuirita Miksa Beraj Kukoj
Currently fruitless Bush=Nuntempe senfrukta Arbusto
Mixed Berry=Miksita Bero
Raw Mixed Berry pie=Kruda Miksita Bera Kuko
Cooked Mixed Berry pie=Kuirita Miksa Beraj Kukoj
Slice of Mixed Berry pie=Tranĉaĵo de Miksita Bera Kuko
Basket with Mixed Berry pies=Korbo kun Miksitaj Beraj Kukoj
Currently fruitless Bush=Nuntempe senfrukta Arbusto
Basket=Korbo

View File

@ -1,39 +1,46 @@
# textdomain: bushes_classic
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Carlos Barraza <carlosbarrazaes@gmail.com>, 2017.
#
Sugar=Azúcar
Strawberry=Frutilla
Raw Strawberry pie=Pastel de Frutilla Crudo
Cooked Strawberry pie=Pastel de Frutilla Cocido
Slice of Strawberry pie=Rebanada de Pastel de Frutilla
Basket with Strawberry pies=Cesta con Pasteles de Frutilla
Cooked Strawberry pie=Pastel de Frutilla Cocido
Raw Strawberry pie=Pastel de Frutilla Crudo
Slice of Strawberry pie=Rebanada de Pastel de Frutilla
Strawberry=Frutilla
Strawberry Bush=Arbusto de Frutilla
Blackberry=Mora
Raw Blackberry pie=Pastel de Mora Crudo
Cooked Blackberry pie=Pastel de Mora Cocido
Slice of Blackberry pie=Rebanada de Pastel de Mora
Basket with Blackberry pies=Cesta con Pasteles de Mora
Blackberry=Mora
Blackberry Bush=Arbusto de Mora
Blueberry=Arándano
Raw Blueberry pie=Pastel de Arándano Crudo
Cooked Blueberry pie=Pastel de Arándano Cocido
Slice of Blueberry pie=Rebanada de Pastel de Arándano
Cooked Blackberry pie=Pastel de Mora Cocido
Raw Blackberry pie=Pastel de Mora Crudo
Slice of Blackberry pie=Rebanada de Pastel de Mora
Basket with Blueberry pies=Cesta con Pasteles de Arándano
Blueberry=Arándano
Blueberry Bush=Arbusto de Arándano
Raspberry=Frambuesa
Raw Raspberry pie=Pastel de Frambuesa Crudo
Cooked Raspberry pie=Pastel de Frambuesa Cocido
Slice of Raspberry pie=Rebanada de Pastel de Frambuesa
Cooked Blueberry pie=Pastel de Arándano Cocido
Raw Blueberry pie=Pastel de Arándano Crudo
Slice of Blueberry pie=Rebanada de Pastel de Arándano
Basket with Raspberry pies=Cesta con Pasteles de Frambuesa
Cooked Raspberry pie=Pastel de Frambuesa Cocido
Raspberry=Frambuesa
Raspberry Bush=Arbusto de Frambuesa
Gooseberry=Grosella
Raw Gooseberry pie=Pastel de Grosella Crudo
Cooked Gooseberry pie=Pastel de Grosella Cocido
Slice of Gooseberry pie=Rebanada de Pastel de Grosella
Raw Raspberry pie=Pastel de Frambuesa Crudo
Slice of Raspberry pie=Rebanada de Pastel de Frambuesa
Basket with Gooseberry pies=Cesta con Pasteles de Grosella
Cooked Gooseberry pie=Pastel de Grosella Cocido
Gooseberry=Grosella
Gooseberry Bush=Arbusto de Grosella
Raw Gooseberry pie=Pastel de Grosella Crudo
Slice of Gooseberry pie=Rebanada de Pastel de Grosella
Basket with Mixed Berry pies=Cesta con Pasteles de Mezcla de Baya
Cooked Mixed Berry pie=Pastel de Mezcla de Bayas Cocido
Currently fruitless Bush=Arbusto actualmente infructuoso
Mixed Berry=Mezcla de Baya
Raw Mixed Berry pie=Pastel de Mezcla de Bayas Cruda
Cooked Mixed Berry pie=Pastel de Mezcla de Bayas Cocido
Slice of Mixed Berry pie=Rebanada de Pastel de Mezcla de Bayas
Basket with Mixed Berry pies=Cesta con Pasteles de Mezcla de Baya
Currently fruitless Bush=Arbusto actualmente infructuoso
Basket=Cesta

View File

@ -1,39 +1,46 @@
# textdomain: bushes_classic
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# fat115 <fat115@framasoft.org>, 2017.
#
Sugar=Sucre
Strawberry=Fraises
Raw Strawberry pie=Tarte aux fraises (crue)
Cooked Strawberry pie=Tarte aux fraises (cuite)
Slice of Strawberry pie=Part de tarte aux fraises
Basket with Strawberry pies=Panier de tartes aux fraises
Cooked Strawberry pie=Tarte aux fraises (cuite)
Raw Strawberry pie=Tarte aux fraises (crue)
Slice of Strawberry pie=Part de tarte aux fraises
Strawberry=Fraises
Strawberry Bush=Buisson de fraises
Blackberry=Mûres
Raw Blackberry pie=Tarte aux mûres (crue)
Cooked Blackberry pie=Tarte aux mûres (cuite)
Slice of Blackberry pie=Part de tarte aux mûres
Basket with Blackberry pies=Panier de tartes aux fraises
Blackberry=Mûres
Blackberry Bush=Buisson de mûres
Blueberry=Myrtilles
Raw Blueberry pie=Tarte aux myrtilles (crue)
Cooked Blueberry pie=Tarte aux myrtilles (cuite)
Slice of Blueberry pie=Part de tarte aux myrtilles
Cooked Blackberry pie=Tarte aux mûres (cuite)
Raw Blackberry pie=Tarte aux mûres (crue)
Slice of Blackberry pie=Part de tarte aux mûres
Basket with Blueberry pies=Panier de tartes aux mûres
Blueberry=Myrtilles
Blueberry Bush=Buisson de myrtilles
Raspberry=Framboises
Raw Raspberry pie=Tarte aux framboises (crue)
Cooked Raspberry pie=Tarte aux framboises (cuite)
Slice of Raspberry pie=Part de tarts aux framboises
Cooked Blueberry pie=Tarte aux myrtilles (cuite)
Raw Blueberry pie=Tarte aux myrtilles (crue)
Slice of Blueberry pie=Part de tarte aux myrtilles
Basket with Raspberry pies=Panier de tartes aux framboises
Cooked Raspberry pie=Tarte aux framboises (cuite)
Raspberry=Framboises
Raspberry Bush=Buisson de framboises
Gooseberry=Groseilles
Raw Gooseberry pie=Tarte aux groseilles (crue)
Cooked Gooseberry pie=Tarte aux groseilles (cuite)
Slice of Gooseberry pie=Part de tarte aux groseilles
Raw Raspberry pie=Tarte aux framboises (crue)
Slice of Raspberry pie=Part de tarts aux framboises
Basket with Gooseberry pies=Panier de tartes aux groseilles
Cooked Gooseberry pie=Tarte aux groseilles (cuite)
Gooseberry=Groseilles
Gooseberry Bush=Buisson de groseilles
Raw Gooseberry pie=Tarte aux groseilles (crue)
Slice of Gooseberry pie=Part de tarte aux groseilles
Basket with Mixed Berry pies=Panier de tartes aux fruits rouges
Cooked Mixed Berry pie=Tarte aux fruits rouges (cuite)
Currently fruitless Bush=Buisson sans fruits pour l'instant
Mixed Berry=Fruits rouges
Raw Mixed Berry pie=Tarte aux fruits rouges (crue)
Cooked Mixed Berry pie=Tarte aux fruits rouges (cuite)
Slice of Mixed Berry pie=Part de tarte aux fruits rouges
Basket with Mixed Berry pies=Panier de tartes aux fruits rouges
Currently fruitless Bush=Buisson sans fruits pour l'instant
Basket=Panier

View File

@ -1,39 +1,46 @@
# textdomain: bushes_classic
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# mahmutelmas06@hotmail.com, 2017.
#
Sugar=Şeker
Strawberry=Çilek
Raw Strawberry pie=Çilekli çiğ pasta
Cooked Strawberry pie=Pişmiş çilekli pasta
Slice of Strawberry pie=Çilekli pasta dilimi
Basket with Strawberry pies=Çilekli pasta sepeti
Cooked Strawberry pie=Pişmiş çilekli pasta
Raw Strawberry pie=Çilekli çiğ pasta
Slice of Strawberry pie=Çilekli pasta dilimi
Strawberry=Çilek
Strawberry Bush=Çilek fidanı
Blackberry=Böğürtlen
Raw Blackberry pie=Böğürtlenli çiğ pasta
Cooked Blackberry pie=Pişmiş böğürtlenli pasta
Slice of Blackberry pie=Böğürtlenli pasta dilimi
Basket with Blackberry pies=Böğürtlenli pasta sepeti
Blackberry=Böğürtlen
Blackberry Bush=Böğürtlen fidanı
Blueberry=Yaban mersini
Raw Blueberry pie=Yaban mersinli çiğ pasta
Cooked Blueberry pie=Pişmiş yaban mersinli pasta
Slice of Blueberry pie=Yaban mersinli pasta dilimi
Cooked Blackberry pie=Pişmiş böğürtlenli pasta
Raw Blackberry pie=Böğürtlenli çiğ pasta
Slice of Blackberry pie=Böğürtlenli pasta dilimi
Basket with Blueberry pies=Yaban mersini pastalı sepet
Blueberry=Yaban mersini
Blueberry Bush=Yaban mersini fidanı
Raspberry=Ahududu
Raw Raspberry pie=Ahududulu çiğ pasta
Cooked Raspberry pie=Pişmiş ahududulu pasta
Slice of Raspberry pie=Ahududulu pasta dilimi
Cooked Blueberry pie=Pişmiş yaban mersinli pasta
Raw Blueberry pie=Yaban mersinli çiğ pasta
Slice of Blueberry pie=Yaban mersinli pasta dilimi
Basket with Raspberry pies=Ahududulu pasta sepeti
Cooked Raspberry pie=Pişmiş ahududulu pasta
Raspberry=Ahududu
Raspberry Bush=Ahududu fidanı
Gooseberry=Bektaşi üzümü
Raw Gooseberry pie=Bektaşi üzümlü çiğ pasta
Cooked Gooseberry pie=Pişmiş bektaşi üzümlü pasta
Slice of Gooseberry pie=Bektaşi üzümlü pasta dilimi
Raw Raspberry pie=Ahududulu çiğ pasta
Slice of Raspberry pie=Ahududulu pasta dilimi
Basket with Gooseberry pies=Bektaşi üzümlü pasta sepeti
Cooked Gooseberry pie=Pişmiş bektaşi üzümlü pasta
Gooseberry=Bektaşi üzümü
Gooseberry Bush=Bektaşi üzümü fidanı
Raw Gooseberry pie=Bektaşi üzümlü çiğ pasta
Slice of Gooseberry pie=Bektaşi üzümlü pasta dilimi
Basket with Mixed Berry pies=Dutlu pasta sepeti
Cooked Mixed Berry pie=Pişmiş dutlu pasta
Currently fruitless Bush=Fidanı şu anda meyvesiz
Mixed Berry=Dut
Raw Mixed Berry pie=Dutlu çiğ pasta
Cooked Mixed Berry pie=Pişmiş dutlu pasta
Slice of Mixed Berry pie=Dutlu pasta dilimi
Basket with Mixed Berry pies=Dutlu pasta sepeti
Currently fruitless Bush=Fidanı şu anda meyvesiz
Basket=Sepet

View File

@ -1,39 +1,46 @@
# textdomain: bushes_classic
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
Sugar=
Strawberry=
Raw Strawberry pie=
Cooked Strawberry pie=
Slice of Strawberry pie=
Basket with Strawberry pies=
Cooked Strawberry pie=
Raw Strawberry pie=
Slice of Strawberry pie=
Strawberry=
Strawberry Bush=
Blackberry=
Raw Blackberry pie=
Cooked Blackberry pie=
Slice of Blackberry pie=
Basket with Blackberry pies=
Blackberry=
Blackberry Bush=
Blueberry=
Raw Blueberry pie=
Cooked Blueberry pie=
Slice of Blueberry pie=
Cooked Blackberry pie=
Raw Blackberry pie=
Slice of Blackberry pie=
Basket with Blueberry pies=
Blueberry=
Blueberry Bush=
Raspberry=
Raw Raspberry pie=
Cooked Raspberry pie=
Slice of Raspberry pie=
Cooked Blueberry pie=
Raw Blueberry pie=
Slice of Blueberry pie=
Basket with Raspberry pies=
Cooked Raspberry pie=
Raspberry=
Raspberry Bush=
Gooseberry=
Raw Gooseberry pie=
Cooked Gooseberry pie=
Slice of Gooseberry pie=
Raw Raspberry pie=
Slice of Raspberry pie=
Basket with Gooseberry pies=
Cooked Gooseberry pie=
Gooseberry=
Gooseberry Bush=
Raw Gooseberry pie=
Slice of Gooseberry pie=
Basket with Mixed Berry pies=
Cooked Mixed Berry pie=
Currently fruitless Bush=
Mixed Berry=
Raw Mixed Berry pie=
Cooked Mixed Berry pie=
Slice of Mixed Berry pie=
Basket with Mixed Berry pies=
Currently fruitless Bush=
Basket=

View File

@ -1,2 +1,3 @@
name = bushes_classic
depends = biome_lib
optional_depends = farming, farming_plus

View File

@ -4,8 +4,6 @@ local S = minetest.get_translator("bushes_classic")
plantlife_bushes = {}
-- TODO: add support for nodebreakers? those dig like mese picks
local random = math.random
plantlife_bushes.after_dig_node = function(pos, oldnode, oldmetadata, digger)
if not (digger and pos and oldnode) then
return
@ -65,7 +63,7 @@ plantlife_bushes.after_dig_node = function(pos, oldnode, oldmetadata, digger)
-- with a chance of 1/3, return 2 bushes
local amount
if can_harvest and random(1,3) == 1 then
if can_harvest and math.random(1,3) == 1 then
amount = "2"
else
amount = "1"
@ -77,7 +75,7 @@ plantlife_bushes.after_dig_node = function(pos, oldnode, oldmetadata, digger)
elseif groupcaps.choppy then
-- the amount of sticks may vary
local amount = random(4, 20)
local amount = math.random(4, 20)
-- return some sticks
harvested = "default:stick " .. amount
@ -138,7 +136,7 @@ minetest.register_abm({
local dirt = minetest.get_node(dirtpos)
local is_soil = minetest.get_item_group(dirt.name, "soil") or minetest.get_item_group(dirt.name, "potting_soil")
if is_soil and (dirt.name == "farming:soil_wet" or random(1,3) == 1) then
if is_soil and (dirt.name == "farming:soil_wet" or math.random(1,3) == 1) then
minetest.swap_node( pos, {name = "bushes:" .. bush_name .. "_bush"})
end
end
@ -163,13 +161,19 @@ for i, bush_name in ipairs(bushes_classic.bushes) do
groups = { dig_immediate = 3 },
})
local texture_top, texture_bottom
local groups = {snappy = 3, bush = 1, flammable = 2, attached_node=1}
if bush_name == "mixed_berry" then
bush_name = "fruitless";
texture_top = "bushes_fruitless_bush_top.png"
texture_bottom = "bushes_fruitless_bush_bottom.png"
groups.not_in_creative_inventory = 1
else
texture_top = "bushes_bush_top.png"
texture_bottom = "bushes_bush_bottom.png"
end
local node_dig_prediction
local node_placement_prediction
if bush_name ~= "fruitless" then

View File

@ -1,2 +1,17 @@
-----------------------------------------------------------------------------------------------
local title = "Cave Stuff"
local version = "0.0.3"
local mname = "cavestuff"
-----------------------------------------------------------------------------------------------
-- support for i18n
local S = minetest.get_translator("cavestuff")
cavestuff = {}
dofile(minetest.get_modpath("cavestuff").."/nodes.lua")
dofile(minetest.get_modpath("cavestuff").."/mapgen.lua")
-----------------------------------------------------------------------------------------------
print("[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...")

View File

@ -1,4 +1,11 @@
# textdomain: cavestuff
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# reusityback, 2022.
#
Pebble=Kieselstein
Desert Pebble=Wüstenkiesel
Stalactite=Stalaktit

View File

@ -1,4 +1,11 @@
# textdomain: cavestuff
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jolesh, 2022.
#
Pebble=Ŝtoneto
Desert Pebble=Dezerta Ŝtoneto
Stalactite=Stalaktito

View File

@ -1,4 +1,11 @@
# textdomain: cavestuff
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# fat115 <fat115@framasoft.org>, 2017.
#
Pebble=Caillou
Desert Pebble=Caillou du désert
Stalactite=Stalactite

View File

@ -1,4 +1,11 @@
# textdomain: cavestuff
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
Pebble=
Desert Pebble=
Stalactite=

View File

@ -62,4 +62,4 @@ minetest.register_decoration({
param2_max = 3,
y_min = -16,
y_max = 48
})
})

View File

@ -1,2 +1,2 @@
name = cavestuff
depends = default
depends = default,biome_lib

View File

@ -1,8 +1,6 @@
-- support for i18n
local S = minetest.get_translator("cavestuff")
local random = math.random
--Rocks
local cbox = {
@ -14,32 +12,33 @@ minetest.register_node("cavestuff:pebble_1",{
description = S("Pebble"),
drawtype = "mesh",
mesh = "cavestuff_pebble.obj",
tiles = {"undergrowth_pebble.png"},
paramtype = "light",
tiles = {"undergrowth_pebble.png"},
paramtype = "light",
paramtype2 = "facedir",
groups = {cracky=3, stone=1, attached_node=1},
selection_box = cbox,
collision_box = cbox,
on_place = function(itemstack, placer, pointed_thing)
groups = {cracky=3, stone=1, attached_node=1},
selection_box = cbox,
collision_box = cbox,
on_place = function(itemstack, placer, pointed_thing)
-- place a random pebble node
local stack = ItemStack("cavestuff:pebble_"..random(1,2))
local stack = ItemStack("cavestuff:pebble_"..math.random(1,2))
local ret = minetest.item_place(stack, placer, pointed_thing)
return ItemStack("cavestuff:pebble_1 "..itemstack:get_count()-(1-ret:get_count()))
end,
sounds = default.node_sound_stone_defaults(),
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("cavestuff:pebble_2",{
drawtype = "mesh",
mesh = "cavestuff_pebble.obj",
tiles = {"undergrowth_pebble.png"},
tiles = {"undergrowth_pebble.png"},
drop = "cavestuff:pebble_1",
paramtype = "light",
tiles = {"undergrowth_pebble.png"},
paramtype = "light",
paramtype2 = "facedir",
groups = {cracky=3, stone=1, attached_node=1, not_in_creative_inventory=1},
groups = {cracky=3, stone=1, attached_node=1, not_in_creative_inventory=1},
selection_box = cbox,
collision_box = cbox,
sounds = default.node_sound_stone_defaults(),
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("cavestuff:desert_pebble_1",{
@ -54,7 +53,7 @@ minetest.register_node("cavestuff:desert_pebble_1",{
collision_box = cbox,
on_place = function(itemstack, placer, pointed_thing)
-- place a random pebble node
local stack = ItemStack("cavestuff:desert_pebble_"..random(1,2))
local stack = ItemStack("cavestuff:desert_pebble_"..math.random(1,2))
local ret = minetest.item_place(stack, placer, pointed_thing)
return ItemStack("cavestuff:desert_pebble_1 "..itemstack:get_count()-(1-ret:get_count()))
end,
@ -101,7 +100,7 @@ minetest.register_node("cavestuff:stalactite_1",{
if not placer then return end
local playername = placer:get_player_name()
if minetest.is_protected(place, playername)
or minetest.is_protected(above, playername) then
or minetest.is_protected(above, playername) then
minetest.record_protection_violation(place, playername)
return
end
@ -114,7 +113,7 @@ minetest.register_node("cavestuff:stalactite_1",{
name = "cavestuff:stalactite_"..math.random(1,3),
param2 = minetest.dir_to_wallmounted(vector.multiply(dir, -1))
})
if not minetest.is_creative_enabled(playername) then
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
end
@ -157,3 +156,5 @@ minetest.register_node("cavestuff:stalactite_3",{
}
},
})
--Stalagmites

View File

@ -53,7 +53,7 @@ minetest.register_craft({
{"default:stick",""}
}
})
if minetest.get_modpath("flint") then
if minetest.get_modpath("flint") ~= nil then
minetest.register_craft({
output = "dryplants:sickle",
recipe = {
@ -63,7 +63,7 @@ if minetest.get_modpath("flint") then
}
})
end
if minetest.get_modpath("stoneage") then
if minetest.get_modpath("stoneage") ~= nil then
minetest.register_craft({
output = "dryplants:sickle",
recipe = {

View File

@ -1,15 +1,33 @@
-----------------------------------------------------------------------------------------------
local title = "Grasses" -- former "Dry plants"
local version = "0.1.5"
local mname = "dryplants"
-----------------------------------------------------------------------------------------------
-- by Mossmanikin
-- textures & ideas partly by Neuromancer
-- Contains code from: default, farming
-- Looked at code from: darkage, sickle, stairs
-- Dependencies: default, farming, biome_lib
-- Supports:
-----------------------------------------------------------------------------------------------
abstract_dryplants = {}
-- support for i18n
local S = minetest.get_translator("dryplants")
abstract_dryplants = {}
dofile(minetest.get_modpath("dryplants").."/crafting.lua")
dofile(minetest.get_modpath("dryplants").."/settings.txt")
dofile(minetest.get_modpath("dryplants").."/reed.lua")
if REEDMACE_GENERATES == true then
dofile(minetest.get_modpath("dryplants").."/reedmace.lua")
end
if SMALL_JUNCUS_GENERATES == true then
dofile(minetest.get_modpath("dryplants").."/juncus.lua")
end
if EXTRA_TALL_GRASS_GENERATES == true then
dofile(minetest.get_modpath("dryplants").."/moregrass.lua")
end
--dofile(minetest.get_modpath("dryplants").."/meadowvariation.lua")
-----------------------------------------------------------------------------------------------
@ -127,7 +145,7 @@ minetest.register_node("dryplants:grass", {
-----------------------------------------------------------------------------------------------
minetest.register_abm({
nodenames = {"dryplants:grass"},
interval = 3600, --1200, -- 20 minutes: a minetest-day/night-cycle
interval = HAY_DRYING_TIME, --1200, -- 20 minutes: a minetest-day/night-cycle
chance = 1,
action = function(pos)
minetest.swap_node(pos, {name="dryplants:hay"})
@ -173,8 +191,8 @@ minetest.register_node("dryplants:grass_short", {
-----------------------------------------------------------------------------------------------
minetest.register_abm({
nodenames = {"dryplants:grass_short"},
interval = 1200, --1200, -- 20 minutes: a minetest-day/night-cycle
chance = 100/1200,
interval = GRASS_REGROWING_TIME, --1200, -- 20 minutes: a minetest-day/night-cycle
chance = 100/GRASS_REGROWING_CHANCE,
action = function(pos)
-- Only become dirt with grass if no cut grass or hay lies on top
local above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z})
@ -183,3 +201,7 @@ minetest.register_abm({
end
end,
})
-----------------------------------------------------------------------------------------------
print("[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...")
-----------------------------------------------------------------------------------------------

View File

@ -1,12 +1,21 @@
-----------------------------------------------------------------------------------------------
-- Grasses - Juncus 0.0.5
-----------------------------------------------------------------------------------------------
-- by Mossmanikin
-- textures & ideas partly by Neuromancer
-- Contains code from: biome_lib
-- Looked at code from: default
-----------------------------------------------------------------------------------------------
-- support for i18n
local S = minetest.get_translator("dryplants")
local function grow_juncus(pos)
abstract_dryplants.grow_juncus = function(pos)
local juncus_type = math.random(2,3)
local right_here = {x=pos.x, y=pos.y+1, z=pos.z}
local nodename = minetest.get_node(right_here).name
if nodename == "air" or nodename == "default:junglegrass" then
if minetest.get_node(right_here).name == "air" -- instead of check_air = true,
or minetest.get_node(right_here).name == "default:junglegrass" then
if juncus_type == 2 then
minetest.swap_node(right_here, {name="dryplants:juncus_02"})
else
@ -37,10 +46,6 @@ minetest.register_node("dryplants:juncus", {
fixed = {-7/16, -1/2, -7/16, 7/16, 0, 7/16},
},
on_place = function(itemstack, placer, pointed_thing)
if not itemstack or not placer or not pointed_thing then
return
end
local playername = placer:get_player_name()
if minetest.is_protected(pointed_thing.above, playername) or
minetest.is_protected(pointed_thing.under, playername) then
@ -55,13 +60,12 @@ minetest.register_node("dryplants:juncus", {
else
minetest.swap_node(right_here, {name="dryplants:juncus"})
end
if not minetest.is_creative_enabled(playername) then
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
end,
})
minetest.register_node("dryplants:juncus_02", {
description = S("Juncus"),
drawtype = "plantlike",
@ -88,69 +92,42 @@ minetest.register_node("dryplants:juncus_02", {
-- GENERATE SMALL JUNCUS
-----------------------------------------------------------------------------------------------
-- near water or swamp
minetest.register_decoration({
name = "dryplants:juncus_water",
decoration = {"air"},
fill_ratio = 0.16,
y_min = 1,
y_max = 40,
place_on = {
"default:dirt_with_grass",
"stoneage:grass_with_silex",
"sumpf:peat",
"sumpf:sumpf"
pl.register_on_generate({
surface = {
"default:dirt_with_grass",
--"default:desert_sand",
--"default:sand",
"stoneage:grass_with_silex",
"sumpf:peat",
"sumpf:sumpf"
},
noise_params = pl.generate_noise_params({max_count = JUNCUS_NEAR_WATER_PER_MAPBLOCK, rarity = 101 - JUNCUS_NEAR_WATER_RARITY}),
min_elevation = 1, -- above sea level
near_nodes = {"default:water_source","sumpf:dirtywater_source","sumpf:sumpf"},
near_nodes_size = 2,
near_nodes_vertical = 1,
near_nodes_count = 1,
},
deco_type = "simple",
flags = "all_floors",
spawn_by = {
"default:water_source",
"sumpf:dirtywater_source",
"sumpf:sumpf"
},
check_offset = -1,
num_spawn_by = 1
})
"dryplants:juncus_near_water",
abstract_dryplants.grow_juncus
)
-- at dunes/beach
minetest.register_decoration({
name = "dryplants:juncus_beach",
decoration = {"air"},
fill_ratio = 0.08,
y_min = 1,
y_max = 40,
place_on = {
"default:sand",
pl.register_on_generate({
surface = {
--"default:dirt_with_grass",
--"default:desert_sand",
"default:sand",
--"stoneage:grass_with_silex",
--"sumpf:peat",
--"sumpf:sumpf"
},
noise_params = pl.generate_noise_params({max_count = JUNCUS_AT_BEACH_PER_MAPBLOCK, rarity = 101 - JUNCUS_AT_BEACH_RARITY}),
min_elevation = 1, -- above sea level
near_nodes = {"default:dirt_with_grass"},
near_nodes_size = 2,
near_nodes_vertical = 1,
near_nodes_count = 1,
},
deco_type = "simple",
flags = "all_floors",
spawn_by = {"default:dirt_with_grass"},
check_offset = -1,
num_spawn_by = 1
})
local did, did2
minetest.register_on_mods_loaded(function()
did = minetest.get_decoration_id("dryplants:juncus_water")
did2 = minetest.get_decoration_id("dryplants:juncus_beach")
minetest.set_gen_notify("decoration", {did, did2})
end)
minetest.register_on_generated(function(minp, maxp, blockseed)
local g = minetest.get_mapgen_object("gennotify")
local locations = {}
local deco_locations_1 = g["decoration#" .. did] or {}
local deco_locations_2 = g["decoration#" .. did2] or {}
for _, pos in pairs(deco_locations_1) do
locations[#locations+1] = pos
end
for _, pos in pairs(deco_locations_2) do
locations[#locations+1] = pos
end
if #locations == 0 then return end
for _, pos in ipairs(locations) do
grow_juncus(pos)
end
end)
"dryplants:junces_at_beach",
abstract_dryplants.grow_juncus
)

View File

@ -1,18 +1,25 @@
# textdomain: dryplants
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# reusityback, 2022.
#
Sickle=Sichel
Cut Grass=Grasschnitt
Cut Grass=Gras schneiden
Hay=Heu
Short Grass=Kurzes Gras
Juncus=Binsen
Wet Reed=Nasses Schilf
Wet Reed Slab=Nasse Schilfplatte
Wet Reed Slab=Nasse Schilfstufe
Wet Reed Roof=Nasses Schilfdach
Wet Reed Roof Corner 1=Nasser Schilfdachwinkel 1
Wet Reed Roof Corner=Nasser Schilfdachwinkel
Wet Reed Roof Corner 2=Nasser Schilfdachwinkel 2
Reed=Schilf
Reed Slab=Schilfstufe
Reed Roof=Schilfdach
Reed Roof Corner 1=Schilfdachwinkel 1
Reed Roof Corner=Schilfdachwinkel
Reed Roof Corner 2=Schilfdachwinkel
Reedmace=Rohrkolben
Reedmace, height: 1=Rohrkolben, Höhe: 1

View File

@ -1,4 +1,11 @@
# textdomain: dryplants
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jolesh, 2022.
#
Sickle=
Cut Grass=Tranĉita Herbenon
Hay=Fojno
@ -7,12 +14,12 @@ Juncus=Junko
Wet Reed=Malseka Kano
Wet Reed Slab=Slabo de Malseka Kano
Wet Reed Roof=Tegmento de Malseka Kano
Wet Reed Roof Corner 1=Tegmentangulo 1 de Malseka Kano
Wet Reed Roof Corner=Tegmentangulo de Malseka Kano
Wet Reed Roof Corner 2=Tegmentangulo 2 de Malseka Kano
Reed=Kano
Reed Slab=Slabo de Kano
Reed Roof=Tegmento de Kano
Reed Roof Corner 1=Tegmentangulo 1 de Kano
Reed Roof Corner=Tegmentangulo de Kano
Reed Roof Corner 2=Tegmentangulo 2 de Kano
Reedmace=Tifeo
Reedmace, height: 1=Tifeo, alteco: 1

View File

@ -1,4 +1,11 @@
# textdomain: dryplants
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# fat115 <fat115@framasoft.org>, 2017.
#
Sickle=Faucille
Cut Grass=Herbe coupée
Hay=Foin
@ -7,12 +14,12 @@ Juncus=Joncs
Wet Reed=Bloc de roseau humide
Wet Reed Slab=Dalle en roseau humide
Wet Reed Roof=Toit en roseau humide
Wet Reed Roof Corner 1=Angle de toit en roseau humide 1
Wet Reed Roof Corner=Angle de toit en roseau humide
Wet Reed Roof Corner 2=Angle de toit en roseau humide 2
Reed=Roseau
Reed Slab=Dalle en roseau
Reed Roof=Toit en roseau
Reed Roof Corner 1=Angle de toit en roseau 1
Reed Roof Corner=Angle de toit en roseau
Reed Roof Corner 2=Angle de toit en roseau 2
Reedmace=Roseau
Reedmace, height: 1=Roseau, 1 de hauteur

View File

@ -1,4 +1,11 @@
# textdomain: dryplants
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
Sickle=
Cut Grass=
Hay=
@ -7,12 +14,12 @@ Juncus=
Wet Reed=
Wet Reed Slab=
Wet Reed Roof=
Wet Reed Roof Corner 1=
Wet Reed Roof Corner=
Wet Reed Roof Corner 2=
Reed=
Reed Slab=
Reed Roof=
Reed Roof Corner 1=
Reed Roof Corner=
Reed Roof Corner 2=
Reedmace=
Reedmace, height: 1=

View File

@ -1,12 +1,24 @@
-- @reviewer: couldn't even find using biome_lib
minetest.register_decoration({
decoration = {"dryplants:grass_short"},
fill_ratio = 0.8,
y_min = 1,
y_max = 40,
place_on = {
"default:dirt_with_grass",
},
deco_type = "simple",
flags = "all_floors"
})
-----------------------------------------------------------------------------------------------
-- Grasses - Meadow Variation 0.0.1
-----------------------------------------------------------------------------------------------
-- by Mossmanikin
-- Contains code from: biome_lib
-- Looked at code from: default
-----------------------------------------------------------------------------------------------
abstract_dryplants.grow_grass_variation = function(pos)
local right_here = {x=pos.x, y=pos.y, z=pos.z}
minetest.swap_node(right_here, {name="dryplants:grass_short"})
end
pl.register_on_generate({
surface = {
"default:dirt_with_grass",
},
noise_params = pl.generate_noise_params({max_count = 4800, rarity = 25}),
min_elevation = 1, -- above sea level
},
"dryplants:grass",
abstract_dryplants.grow_grass_variation
)

View File

@ -1,3 +1,3 @@
name = dryplants
depends = default
optional_depends = farming, ebiomes
depends = default, biome_lib
optional_depends = farming

View File

@ -1,3 +1,12 @@
-----------------------------------------------------------------------------------------------
-- Grasses - More Tall Grass 0.0.2
-----------------------------------------------------------------------------------------------
-- by Mossmanikin
-- Contains code from: biome_lib
-- Looked at code from: default
-----------------------------------------------------------------------------------------------
minetest.register_decoration({
decoration = {
"default:grass_1",
@ -6,15 +15,15 @@ minetest.register_decoration({
"default:grass_4",
"default:grass_5"
},
fill_ratio = 0.8,
y_min = 1,
y_max = 40,
place_on = {
"default:dirt_with_grass",
"stoneage:grass_with_silex",
"sumpf:peat",
"sumpf:sumpf"
},
noise_params = pl.generate_noise_params({max_count = TALL_GRASS_PER_MAPBLOCK, rarity = 101 - TALL_GRASS_RARITY}),
flags = "all_floors",
deco_type = "simple",
flags = "all_floors"
})
y_min = 1,
y_max = 48
})

View File

@ -75,103 +75,106 @@ minetest.register_node("dryplants:wetreed_roof", {
sounds = default.node_sound_leaves_defaults(),
})
local CoRNeR = {
if AUTO_ROOF_CORNER == true then
local CoRNeR = {
-- MaTeRiaL
{"wetreed"},
{"reed"}
}
{"wetreed"},
{"reed"}
}
for i in pairs(CoRNeR) do
for i in pairs(CoRNeR) do
local MaTeRiaL = CoRNeR[i][1]
local roof = "dryplants:"..MaTeRiaL.."_roof"
local corner = "dryplants:"..MaTeRiaL.."_roof_corner"
local corner_2 = "dryplants:"..MaTeRiaL.."_roof_corner_2"
local MaTeRiaL = CoRNeR[i][1]
local roof = "dryplants:"..MaTeRiaL.."_roof"
local corner = "dryplants:"..MaTeRiaL.."_roof_corner"
local corner_2 = "dryplants:"..MaTeRiaL.."_roof_corner_2"
minetest.register_abm({
nodenames = {roof},
interval = 1,
chance = 1,
action = function(pos)
minetest.register_abm({
nodenames = {roof},
interval = 1,
chance = 1,
action = function(pos)
local node_east = minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z })
local node_west = minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z })
local node_north = minetest.get_node({x=pos.x, y=pos.y, z=pos.z+1})
local node_south = minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1})
-- corner 1
if ((node_west.name == roof and node_west.param2 == 0)
or (node_west.name == corner and node_west.param2 == 1))
and ((node_north.name == roof and node_north.param2 == 3)
or (node_north.name == corner and node_north.param2 == 3))
then
minetest.swap_node(pos, {name=corner, param2=0})
end
local node_east = minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z })
local node_west = minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z })
local node_north = minetest.get_node({x=pos.x, y=pos.y, z=pos.z+1})
local node_south = minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1})
-- corner 1
if ((node_west.name == roof and node_west.param2 == 0)
or (node_west.name == corner and node_west.param2 == 1))
and ((node_north.name == roof and node_north.param2 == 3)
or (node_north.name == corner and node_north.param2 == 3))
then
minetest.swap_node(pos, {name=corner, param2=0})
end
if ((node_north.name == roof and node_north.param2 == 1)
or (node_north.name == corner and node_north.param2 == 2))
and ((node_east.name == roof and node_east.param2 == 0)
or (node_east.name == corner and node_east.param2 == 0))
then
minetest.swap_node(pos, {name=corner, param2=1})
end
if ((node_north.name == roof and node_north.param2 == 1)
or (node_north.name == corner and node_north.param2 == 2))
and ((node_east.name == roof and node_east.param2 == 0)
or (node_east.name == corner and node_east.param2 == 0))
then
minetest.swap_node(pos, {name=corner, param2=1})
end
if ((node_east.name == roof and node_east.param2 == 2)
or (node_east.name == corner and node_east.param2 == 3))
and ((node_south.name == roof and node_south.param2 == 1)
or (node_south.name == corner and node_south.param2 == 1))
then
minetest.swap_node(pos, {name=corner, param2=2})
end
if ((node_east.name == roof and node_east.param2 == 2)
or (node_east.name == corner and node_east.param2 == 3))
and ((node_south.name == roof and node_south.param2 == 1)
or (node_south.name == corner and node_south.param2 == 1))
then
minetest.swap_node(pos, {name=corner, param2=2})
end
if ((node_south.name == roof and node_south.param2 == 3)
or (node_south.name == corner and node_south.param2 == 0))
and ((node_west.name == roof and node_west.param2 == 2)
or (node_west.name == corner and node_west.param2 == 2))
then
minetest.swap_node(pos, {name=corner, param2=3})
end
-- corner 2
if ((node_west.name == roof and node_west.param2 == 2)
or (node_west.name == corner_2 and node_west.param2 == 1))
and ((node_north.name == roof and node_north.param2 == 1)
or (node_north.name == corner_2 and node_north.param2 == 3))
then
minetest.swap_node(pos, {name=corner_2, param2=0})
end
if ((node_south.name == roof and node_south.param2 == 3)
or (node_south.name == corner and node_south.param2 == 0))
and ((node_west.name == roof and node_west.param2 == 2)
or (node_west.name == corner and node_west.param2 == 2))
then
minetest.swap_node(pos, {name=corner, param2=3})
end
-- corner 2
if ((node_west.name == roof and node_west.param2 == 2)
or (node_west.name == corner_2 and node_west.param2 == 1))
and ((node_north.name == roof and node_north.param2 == 1)
or (node_north.name == corner_2 and node_north.param2 == 3))
then
minetest.swap_node(pos, {name=corner_2, param2=0})
end
if ((node_north.name == roof and node_north.param2 == 3)
or (node_north.name == corner_2 and node_north.param2 == 2))
and ((node_east.name == roof and node_east.param2 == 2)
or (node_east.name == corner_2 and node_east.param2 == 0))
then
minetest.swap_node(pos, {name=corner_2, param2=1})
end
if ((node_north.name == roof and node_north.param2 == 3)
or (node_north.name == corner_2 and node_north.param2 == 2))
and ((node_east.name == roof and node_east.param2 == 2)
or (node_east.name == corner_2 and node_east.param2 == 0))
then
minetest.swap_node(pos, {name=corner_2, param2=1})
end
if ((node_east.name == roof and node_east.param2 == 0)
or (node_east.name == corner_2 and node_east.param2 == 3))
and ((node_south.name == roof and node_south.param2 == 3)
or (node_south.name == corner_2 and node_south.param2 == 1))
then
minetest.swap_node(pos, {name=corner_2, param2=2})
end
if ((node_east.name == roof and node_east.param2 == 0)
or (node_east.name == corner_2 and node_east.param2 == 3))
and ((node_south.name == roof and node_south.param2 == 3)
or (node_south.name == corner_2 and node_south.param2 == 1))
then
minetest.swap_node(pos, {name=corner_2, param2=2})
end
if ((node_south.name == roof and node_south.param2 == 1)
or (node_south.name == corner_2 and node_south.param2 == 0))
and ((node_west.name == roof and node_west.param2 == 0)
or (node_west.name == corner_2 and node_west.param2 == 2))
then
minetest.swap_node(pos, {name=corner_2, param2=3})
end
if ((node_south.name == roof and node_south.param2 == 1)
or (node_south.name == corner_2 and node_south.param2 == 0))
and ((node_west.name == roof and node_west.param2 == 0)
or (node_west.name == corner_2 and node_west.param2 == 2))
then
minetest.swap_node(pos, {name=corner_2, param2=3})
end
end,
})
end,
})
end
end
-----------------------------------------------------------------------------------------------
-- Wet Reed Roof Corner 1
-- Wet Reed Roof Corner
-----------------------------------------------------------------------------------------------
minetest.register_node("dryplants:wetreed_roof_corner", {
description = S("Wet Reed Roof Corner 1"),
description = S("Wet Reed Roof Corner"),
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
@ -230,28 +233,31 @@ minetest.register_node("dryplants:wetreed_roof_corner_2", {
-----------------------------------------------------------------------------------------------
-- Wet Reed becomes (dry) Reed over time
-----------------------------------------------------------------------------------------------
local DRyiNG = {
if REED_WILL_DRY == true then
local DRyiNG = {
-- WeT DRy
{"dryplants:wetreed", "dryplants:reed"},
{"dryplants:wetreed_slab", "dryplants:reed_slab"},
{"dryplants:wetreed_roof", "dryplants:reed_roof"},
{"dryplants:wetreed_roof_corner", "dryplants:reed_roof_corner"},
{"dryplants:wetreed_roof_corner_2", "dryplants:reed_roof_corner_2"}
}
for i in pairs(DRyiNG) do
{"dryplants:wetreed", "dryplants:reed"},
{"dryplants:wetreed_slab", "dryplants:reed_slab"},
{"dryplants:wetreed_roof", "dryplants:reed_roof"},
{"dryplants:wetreed_roof_corner", "dryplants:reed_roof_corner"},
{"dryplants:wetreed_roof_corner_2", "dryplants:reed_roof_corner_2"}
}
for i in pairs(DRyiNG) do
local WeT = DRyiNG[i][1]
local DRy = DRyiNG[i][2]
local WeT = DRyiNG[i][1]
local DRy = DRyiNG[i][2]
minetest.register_abm({
nodenames = {WeT},
interval = 3600, --1200, -- 20 minutes: a minetest-day/night-cycle
chance = 1,
action = function(pos)
local direction = minetest.get_node(pos).param2
minetest.swap_node(pos, {name=DRy, param2=direction})
end,
})
minetest.register_abm({
nodenames = {WeT},
interval = REED_DRYING_TIME, --1200, -- 20 minutes: a minetest-day/night-cycle
chance = 1,
action = function(pos)
local direction = minetest.get_node(pos).param2
minetest.swap_node(pos, {name=DRy, param2=direction})
end,
})
end
end
-----------------------------------------------------------------------------------------------
@ -316,10 +322,10 @@ minetest.register_node("dryplants:reed_roof", {
})
-----------------------------------------------------------------------------------------------
-- Reed Roof Corner 1
-- Reed Roof Corner
-----------------------------------------------------------------------------------------------
minetest.register_node("dryplants:reed_roof_corner", {
description = S("Reed Roof Corner 1"),
description = S("Reed Roof Corner"),
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",

View File

@ -1,3 +1,13 @@
-----------------------------------------------------------------------------------------------
-- Grasses - Reedmace 0.1.1
-----------------------------------------------------------------------------------------------
-- by Mossmanikin
-- textures & ideas partly by Neuromancer
-- Contains code from: biome_lib
-- Looked at code from: default, trees
-----------------------------------------------------------------------------------------------
-- NOTES (from wikipedia, some of this might get implemented)
-- rhizomes are edible
-- outer portion of young plants can be peeled and the heart can be eaten raw or boiled and eaten like asparagus
@ -14,16 +24,14 @@ local S = minetest.get_translator("dryplants")
-- REEDMACE SHAPES
-----------------------------------------------------------------------------------------------
local function grow_reedmace(pos)
abstract_dryplants.grow_reedmace = function(pos)
local size = math.random(1,3)
local spikes = math.random(1,3)
local pos_01 = {x = pos.x, y = pos.y + 1, z = pos.z}
local pos_02 = {x = pos.x, y = pos.y + 2, z = pos.z}
local pos_03 = {x = pos.x, y = pos.y + 3, z = pos.z}
local nodename = minetest.get_node(pos_01).name
if nodename == "air" -- bug fix
or nodename == "dryplants:reedmace_sapling" then
if minetest.get_node(pos_01).name == "air" -- bug fix
or minetest.get_node(pos_01).name == "dryplants:reedmace_sapling" then
if minetest.get_node(pos_02).name ~= "air" then
minetest.swap_node(pos_01, {name="dryplants:reedmace_top"})
elseif minetest.get_node(pos_03).name ~= "air" then
@ -42,16 +50,14 @@ local function grow_reedmace(pos)
end
end
local function grow_reedmace_water(pos)
abstract_dryplants.grow_reedmace_water = function(pos)
local size = math.random(1,3)
local spikes = math.random(1,3)
local pos_01 = {x = pos.x, y = pos.y + 1, z = pos.z}
local pos_02 = {x = pos.x, y = pos.y + 2, z = pos.z}
local pos_03 = {x = pos.x, y = pos.y + 3, z = pos.z}
local pos_04 = {x = pos.x, y = pos.y + 4, z = pos.z}
minetest.add_entity(pos_01, "dryplants:reedmace_water_entity")
if minetest.get_node(pos_02).name == "air" then -- bug fix
if minetest.get_node(pos_03).name ~= "air" then
minetest.swap_node(pos_02, {name="dryplants:reedmace_top"})
@ -71,8 +77,6 @@ local function grow_reedmace_water(pos)
end
end
abstract_dryplants.grow_reedmace = grow_reedmace -- compatibility
-----------------------------------------------------------------------------------------------
-- REEDMACE SPIKES
-----------------------------------------------------------------------------------------------
@ -272,19 +276,19 @@ minetest.register_node("dryplants:reedmace_sapling", {
-- abm
minetest.register_abm({
nodenames = "dryplants:reedmace_sapling",
interval = 600,
chance = 100/5,
interval = REEDMACE_GROWING_TIME,
chance = 100/REEDMACE_GROWING_CHANCE,
action = function(pos, node, _, _)
if string.find(minetest.get_node({x = pos.x + 1, y = pos.y, z = pos.z }).name, "default:water")
or string.find(minetest.get_node({x = pos.x, y = pos.y, z = pos.z + 1}).name, "default:water")
or string.find(minetest.get_node({x = pos.x - 1, y = pos.y, z = pos.z }).name, "default:water")
or string.find(minetest.get_node({x = pos.x, y = pos.y, z = pos.z - 1}).name, "default:water") then
if minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name == "air" then
grow_reedmace_water({x = pos.x, y = pos.y - 1, z = pos.z})
abstract_dryplants.grow_reedmace_water({x = pos.x, y = pos.y - 1, z = pos.z})
end
minetest.swap_node({x=pos.x, y=pos.y, z=pos.z}, {name="default:water_source"})
else
grow_reedmace({x = pos.x, y = pos.y - 1, z = pos.z})
abstract_dryplants.grow_reedmace({x = pos.x, y = pos.y - 1, z = pos.z})
end
end
})
@ -314,7 +318,7 @@ minetest.register_entity("dryplants:reedmace_water_entity",{
collisionbox = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3},
on_punch = function(self, puncher)
if puncher:is_player() and puncher:get_inventory() then
if not minetest.is_creative_enabled(puncher:get_player_name()) then
if not minetest.setting_getbool("creative_mode") then
puncher:get_inventory():add_item("main", "dryplants:reedmace_sapling")
end
self.object:remove()
@ -322,120 +326,86 @@ minetest.register_entity("dryplants:reedmace_water_entity",{
end,
})
-----------------------------------------------------------------------------------------------
-- SPAWN REEDMACE
-----------------------------------------------------------------------------------------------
--[[biome_lib.register_active_spawner({
spawn_delay = 1200,
spawn_plants = {"dryplants:reedmace_sapling"},
spawn_chance = 400,
spawn_surfaces = {
"default:dirt_with_grass",
"default:desert_sand",
"default:sand",
"dryplants:grass_short",
"stoneage:grass_with_silex"
},
seed_diff = 329,
near_nodes = {"default:water_source"},
near_nodes_size = 2,
near_nodes_vertical = 1,
near_nodes_count = 1,
})]]
-----------------------------------------------------------------------------------------------
-- GENERATE REEDMACE
-----------------------------------------------------------------------------------------------
-- near water or swamp
minetest.register_decoration({
name = "dryplants:reedmace_swamp",
decoration = {"air"},
fill_ratio = "0.05",
y_min = 1,
y_max = 40,
place_on = {
"default:dirt_with_grass",
"default:desert_sand",
"stoneage:grass_with_silex",
"sumpf:peat",
"sumpf:sumpf"
pl.register_on_generate({
surface = {
"default:dirt_with_grass",
"default:desert_sand",
"stoneage:grass_with_silex",
"sumpf:peat",
"sumpf:sumpf"
},
noise_params = pl.generate_noise_params({max_count = REEDMACE_NEAR_WATER_PER_MAPBLOCK, rarity = 101 - REEDMACE_NEAR_WATER_RARITY}),
--rarity = 60,
min_elevation = 1, -- above sea level
near_nodes = {"default:water_source","sumpf:dirtywater_source","sumpf:sumpf"},
near_nodes_size = 2,
near_nodes_vertical = 1,
near_nodes_count = 1,
},
deco_type = "simple",
flags = "all_floors",
spawn_by = {
"default:water_source",
"sumpf:dirtywater_source",
"sumpf:sumpf"
},
check_offset = -1,
num_spawn_by = 1
})
"dryplants:reedmace_near_water",
abstract_dryplants.grow_reedmace
)
-- in water
minetest.register_decoration({
name = "dryplants:reedmace_water",
decoration = {"air"},
fill_ratio = "0.01",
y_min = 0,
y_max = 0,
place_on = {
"default:dirt",
"default:dirt_with_grass",
"stoneage:sand_with_silex",
"sumpf:peat",
"sumpf:sumpf"
pl.register_on_generate({
surface = {
"default:dirt",
"default:dirt_with_grass",
--"default:desert_sand",
--"stoneage:grass_with_silex",
"stoneage:sand_with_silex",
"sumpf:peat",
"sumpf:sumpf"
},
noise_params = pl.generate_noise_params({max_count = REEDMACE_IN_WATER_PER_MAPBLOCK, rarity = 101 - REEDMACE_IN_WATER_RARITY}),
--rarity = 35,
min_elevation = 0, -- a bit below sea level
max_elevation = 0, -- ""
near_nodes = {"default:water_source","sumpf:dirtywater_source"},
near_nodes_size = 1,
near_nodes_count = 1,
},
deco_type = "simple",
flags = "all_floors",
spawn_by = {
"default:water_source",
"sumpf:dirtywater_source"
},
check_offset = -1,
num_spawn_by = 1
})
"dryplants:reedmace_in_water",
abstract_dryplants.grow_reedmace_water
)
-- for oases & tropical beaches & tropical swamps
minetest.register_decoration({
name = "dryplants:reedmace_beach",
decoration = {"air"},
fill_ratio = "0.05",
y_min = 1,
y_max = 40,
place_on = {
"default:sand",
"sumpf:sumpf"
pl.register_on_generate({
surface = {
"default:sand",
"sumpf:sumpf"
},
noise_params = pl.generate_noise_params({max_count = REEDMACE_FOR_OASES_PER_MAPBLOCK, 101 - REEDMACE_FOR_OASES_RARITY}),
--rarity = 10,
neighbors = {"default:water_source","sumpf:dirtywater_source","sumpf:sumpf"},
ncount = 1,
min_elevation = 1, -- above sea level
near_nodes = {"default:desert_sand","sumpf:sumpf"},
near_nodes_size = 2,
near_nodes_vertical = 1,
near_nodes_count = 1,
},
deco_type = "simple",
flags = "all_floors",
spawn_by = {
"default:water_source",
"sumpf:dirtywater_source",
"sumpf:sumpf",
"default:desert_sand"
},
check_offset = -1,
num_spawn_by = 1
})
local did, did2, did3
minetest.register_on_mods_loaded(function()
did = minetest.get_decoration_id("dryplants:reedmace_swamp")
did2 = minetest.get_decoration_id("dryplants:reedmace_water")
did3 = minetest.get_decoration_id("dryplants:reedmace_beach")
minetest.set_gen_notify("decoration", {did, did2, did3})
end)
minetest.register_on_generated(function(minp, maxp, blockseed)
local g = minetest.get_mapgen_object("gennotify")
local locations = {}
local deco_locations_1 = g["decoration#" .. did] or {}
local deco_locations_3 = g["decoration#" .. did3] or {}
for _, pos in pairs(deco_locations_1) do
locations[#locations+1] = pos
end
for _, pos in pairs(deco_locations_3) do
locations[#locations+1] = pos
end
if #locations == 0 then return end
for _, pos in ipairs(locations) do
grow_reedmace(pos)
end
end)
minetest.register_on_generated(function(minp, maxp, blockseed)
local g = minetest.get_mapgen_object("gennotify")
local locations = {}
local deco_locations_2 = g["decoration#" .. did2] or {}
for _, pos in pairs(deco_locations_2) do
locations[#locations+1] = pos
end
if #locations == 0 then return end
for _, pos in ipairs(locations) do
grow_reedmace_water(pos)
end
end)
"dryplants:reemace_oases",
abstract_dryplants.grow_reedmace
)

52
dryplants/settings.txt Normal file
View File

@ -0,0 +1,52 @@
-- Here you can enable/disable the different plants
REEDMACE_GENERATES = true
SMALL_JUNCUS_GENERATES = true
EXTRA_TALL_GRASS_GENERATES = true
-- Amount of Reedmace near water or swamp
REEDMACE_NEAR_WATER_PER_MAPBLOCK = 35 -- plants per 80x80x80 nodes (absolute maximum number)
REEDMACE_NEAR_WATER_RARITY = 40 -- percent
-- Amount of Reedmace in water
REEDMACE_IN_WATER_PER_MAPBLOCK = 35 -- plants per 80x80x80 nodes (absolute maximum number)
REEDMACE_IN_WATER_RARITY = 65 -- percent
-- Amount of Reedmace for oases, tropical beaches and tropical swamps
REEDMACE_FOR_OASES_PER_MAPBLOCK = 35 -- plants per 80x80x80 nodes (absolute maximum number)
REEDMACE_FOR_OASES_RARITY = 90 -- percent
-- growing of reedmace sapling
REEDMACE_GROWING_TIME = 600 -- seconds
REEDMACE_GROWING_CHANCE = 5 -- percent
-- Amount of small Juncus near water or swamp
JUNCUS_NEAR_WATER_PER_MAPBLOCK = 70 -- plants per 80x80x80 nodes (absolute maximum number)
JUNCUS_NEAR_WATER_RARITY = 75 -- percent
-- Amount of small Juncus at dunes/beach
JUNCUS_AT_BEACH_PER_MAPBLOCK = 70 -- plants per 80x80x80 nodes (absolute maximum number)
JUNCUS_AT_BEACH_RARITY = 75 -- percent
-- Tall Grass on dirt with grass
TALL_GRASS_PER_MAPBLOCK = 4800 -- plants per 80x80x80 nodes (absolute maximum number)
TALL_GRASS_RARITY = 75 -- percent
-- short grass becomes dirt with grass again
GRASS_REGROWING_TIME = 1200 -- seconds
GRASS_REGROWING_CHANCE = 5 -- percent
HAY_DRYING_TIME = 3600 -- seconds
REED_WILL_DRY = false -- wet reed nodes will become dry reed nodes
REED_DRYING_TIME = 3600 -- seconds
AUTO_ROOF_CORNER = true

View File

@ -30,7 +30,7 @@ minetest.register_craft({
-----------------------------------------------------------------------------------------------
-- FIDDLEHEAD
-----------------------------------------------------------------------------------------------
minetest.register_alias("archaeplantae:fiddlehead", "ferns:fiddlehead")
minetest.register_alias("archaeplantae:fiddlehead", "ferns:fiddlehead")
minetest.register_craftitem("ferns:fiddlehead", {
description = S("Fiddlehead"),
@ -51,7 +51,7 @@ minetest.register_craftitem("ferns:fiddlehead_roasted", {
-----------------------------------------------------------------------------------------------
-- FERN TUBER
-----------------------------------------------------------------------------------------------
minetest.register_alias("archaeplantae:ferntuber", "ferns:ferntuber")
minetest.register_alias("archaeplantae:ferntuber", "ferns:ferntuber")
minetest.register_craftitem("ferns:ferntuber", {
description = S("Fern Tuber"),
@ -64,7 +64,7 @@ minetest.register_craft({
cooktime = 3,
})
minetest.register_alias("archaeplantae:ferntuber_roasted", "ferns:ferntuber_roasted")
minetest.register_alias("archaeplantae:ferntuber_roasted", "ferns:ferntuber_roasted")
minetest.register_craftitem("ferns:ferntuber_roasted", {
description = S("Roasted Fern Tuber"),

View File

@ -84,8 +84,8 @@ abstract_ferns.grow_giant_tree_fern = function(pos)
local brk = false
for i = 1, size-3 do
pos_aux.y = pos.y + i
local nodename = minetest.get_node(pos_aux).name
if not (nodename == "air" or (i == 1 and nodename == "ferns:sapling_giant_tree_fern")) then
local name = minetest.get_node(pos_aux).name
if not (name == "air" or (i == 1 and name == "ferns:sapling_giant_tree_fern")) then
brk = true
break
end
@ -282,16 +282,13 @@ minetest.register_node("ferns:fern_trunk_big", {
},
groups = {tree=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
sounds = default.node_sound_wood_defaults(),
after_dig_node = function(pos, node, metadata, digger)
if digger == nil then return end
local np = {x=pos.x,y=pos.y+1,z=pos.z}
local nn = minetest.get_node(np)
if nn.name == "ferns:fern_trunk_big" or
nn.name == "ferns:fern_trunk_big_top"
then
minetest.node_dig(np, nn, digger)
end
end,
after_destruct = function(pos,oldnode)
local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})
if node.name == "ferns:fern_trunk_big" or node.name == "ferns:fern_trunk_big_top" then
minetest.dig_node({x=pos.x,y=pos.y+1,z=pos.z})
minetest.add_item(pos,"ferns:fern_trunk_big")
end
end,
})
-----------------------------------------------------------------------------------------------

View File

@ -34,13 +34,13 @@ local function create_nodes()
local node_drop = "ferns:horsetail_04"
if i == 1 then
node_desc = S("Young Horsetail (Equisetum) @1", 1)
node_desc = S("Young Horsetail (Equisetum)")
node_on_use = minetest.item_eat(1) -- young ones edible https://en.wikipedia.org/wiki/Equisetum
node_drop = node_name
elseif i == 4 then
node_desc = S("Horsetail (Equisetum)")
else
node_desc = S("Horsetail (Equisetum) @1", i)
node_desc = S("Horsetail (Equisetum)").." ".. string.format("%02d", i)
end
node_names[i] = node_name
@ -75,10 +75,13 @@ create_nodes()
-- Spawning
-----------------------------------------------------------------------------------------------
if abstract_ferns.config.enable_horsetails_spawning == true then
minetest.register_abm({
nodenames = {
biome_lib.register_active_spawner({
spawn_delay = 1200,
spawn_plants = node_names,
spawn_chance = 400,
spawn_surfaces = {
"default:dirt_with_grass",
"default:dirt_with_coniferous_litter",
"default:dirt_with_coniferous_litter", -- minetest >= 0.5
"default:desert_sand",
"default:sand",
"dryplants:grass_short",
@ -86,28 +89,13 @@ if abstract_ferns.config.enable_horsetails_spawning == true then
"default:mossycobble",
"default:gravel"
},
interval = 1200,
chance = 400,
label = "[ferns] spawn horsetails",
min_y = 1,
max_y = 48,
action = function(pos, node)
local p_top = {x = pos.x, y = pos.y + 1, z = pos.z}
local n_top = minetest.get_node_or_nil(p_top)
if not n_top or n_top.name ~= "air" then return end
local NEAR_DST = 2
if #minetest.find_nodes_in_area(
{x=pos.x-NEAR_DST, y=pos.y-1, z=pos.z-NEAR_DST},
{x=pos.x+NEAR_DST, y=pos.y+1, z=pos.z+NEAR_DST},
{"default:water_source","default:river_water_source","default:gravel"}
) < 1 then return
end
local plant_to_spawn = node_names[math.random(1, #node_names)]
minetest.swap_node(p_top, {name = plant_to_spawn, param2 = 0})
end
seed_diff = 329,
min_elevation = 1, -- above sea level
near_nodes = {"default:water_source","default:river_water_source","default:gravel"},
near_nodes_size = 2,
near_nodes_vertical = 1,
near_nodes_count = 1,
--random_facedir = { 0, 179 },
})
end

View File

@ -1,5 +1,16 @@
-----------------------------------------------------------------------------------------------
local title = "Ferns" -- former "Archae Plantae"
local version = "0.2.1"
local mname = "ferns" -- former "archaeplantae"
-----------------------------------------------------------------------------------------------
-- (by Mossmanikin)
-----------------------------------------------------------------------------------------------
abstract_ferns = {}
-- support for i18n
local S = minetest.get_translator("ferns")
dofile(minetest.get_modpath("ferns").."/settings.lua")
if abstract_ferns.config.enable_lady_fern == true then
@ -19,3 +30,42 @@ if abstract_ferns.config.enable_giant_treefern == true then
end
dofile(minetest.get_modpath("ferns").."/crafting.lua")
-----------------------------------------------------------------------------
-- TESTS
-----------------------------------------------------------------------------
local run_tests = true -- set to false to skip
if run_tests then
-- These are, essentially, unit tests to make sure that all required item
-- strings are registered. The init sequence is not time critical so leaving
-- them here won't affect performance.
-- Check node names
if abstract_ferns.config.enable_horsetails then
print("[Mod] " ..title.. " Checking horsetail item strings")
assert(minetest.registered_items["ferns:horsetail_01"] ~= nil)
assert(minetest.registered_items["ferns:horsetail_02"] ~= nil)
assert(minetest.registered_items["ferns:horsetail_03"] ~= nil)
assert(minetest.registered_items["ferns:horsetail_04"] ~= nil)
end
if abstract_ferns.config.enable_lady_fern then
print("[Mod] ".. title .." Checking lady fern item strings")
assert(minetest.registered_items["ferns:fern_01"] ~= nil)
assert(minetest.registered_items["ferns:fern_02"] ~= nil)
assert(minetest.registered_items["ferns:fern_03"] ~= nil)
end
if abstract_ferns.config.enable_treefern then
print("[Mod] ".. title .." Checking tree fern item strings")
assert(minetest.registered_items["ferns:tree_fern_leaves"] ~= nil)
assert(minetest.registered_items["ferns:tree_fern_leaves_02"] ~= nil)
assert(minetest.registered_items["ferns:fern_trunk"] ~= nil)
assert(minetest.registered_items["ferns:sapling_tree_fern"] ~= nil)
end
end
-----------------------------------------------------------------------------------------------
print("[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...")
-----------------------------------------------------------------------------------------------

View File

@ -1,16 +1,23 @@
# textdomain: ferns
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# reusityback, 2022.
#
Fiddlehead=Geigenkopf
Roasted Fiddlehead=Gerösteter Geigenkopf
Fern Tuber=Farnknolle
Roasted Fern Tuber=Geröstete Farnknolle
Lady-fern (Athyrium)=Frauenfarn (Athyrium)
Tree Fern Crown (Dicksonia)=Baumfarnkrone (Dicksonia)
Giant Tree Fern Leaves=Riesige Baumfarnblätter
Giant Tree Fern Leave End=Riesiges Baumfarnblattende
Giant Fern Trunk=Riesiger Baumfarnstamm
Giant Tree Fern Sapling=Riesiger Baumfarnsetzling
Tree Fern Crown (Dicksonia)=Baumfarnkrone (Dicksonia)
Young Horsetail (Equisetum) @1=Junger Schachtelhalm (Equisetum) @1
Young Horsetail (Equisetum)=Junger Schachtelhalm (Equisetum)
Horsetail (Equisetum)=Schachtelhalm (Equisetum)
Horsetail (Equisetum) @1= Schachtelhalm (Equisetum) @1
Fern Trunk (Dicksonia)=Farnstamm (Dicksonia)
Tree Fern Sapling (Dicksonia)=Baumfarnsetzling (Dicksonia)

View File

@ -1,16 +1,23 @@
# textdomain: ferns
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jolesh, 2022.
#
Fiddlehead=Filika Supro
Roasted Fiddlehead=Rostita Filika Supro
Fern Tuber=Filika Tubero
Roasted Fern Tuber=Rostita Filika Tubero
Lady-fern (Athyrium)=Afiriumo (Athyrium)
Tree Fern Crown (Dicksonia)=Krono de Arba Filiko
Giant Tree Fern Leaves=Folioj de Giganta Arba Filiko
Giant Tree Fern Leave End=Folifino de Giganta Arba Filiko
Giant Fern Trunk=Trunko de Giganta Arba Filiko
Giant Tree Fern Sapling=Arbido de Giganta Arba Filiko
Tree Fern Crown (Dicksonia)=Krono de Arba Filiko
Young Horsetail (Equisetum) @1=Juna Ekvizeto (Equisetum) @1
Young Horsetail (Equisetum)=Juna Ekvizeto (Equisetum)
Horsetail (Equisetum)=Ekvizeto (Equisetum)
Horsetail (Equisetum) @1=Ekvizeto (Equisetum) @1
Fern Trunk (Dicksonia)=Trunko de Arba Filiko (Dicksonia)
Tree Fern Sapling (Dicksonia)=Arbido de Arba Filiko (Dicksonia)

View File

@ -1,16 +1,22 @@
# textdomain: ferns
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# fat115 <fat115@framasoft.org>, 2017.
#
Fiddlehead=Crosse de fougère
Roasted Fiddlehead=Crosse de fougère rôtie
Fern Tuber=Tubercule de fougère
Roasted Fern Tuber=Tubercule de fougère rôti
Lady-fern (Athyrium)=Fougère (Athyrium)
Tree Fern Crown (Dicksonia)=Fougère en couronne (Dicksonia)
Giant Tree Fern Leaves=Feuilles de fougère géante
Giant Tree Fern Leave End=Feuilles de fougère géante (extrémité)
Giant Fern Trunk=Tronc de fougère géante
Giant Tree Fern Sapling=Pousse de fougère géante
Tree Fern Crown (Dicksonia)=Fougère en couronne (Dicksonia)
Young Horsetail (Equisetum) @1=Pousse de prêle (Equisetum) @1
Young Horsetail (Equisetum)=Pousse de prêle (Equisetum)
Horsetail (Equisetum)=Prêle (Equisetum)
Horsetail (Equisetum) @1=Prêle (Equisetum) @1
Fern Trunk (Dicksonia)=Tronc de fougère en couronne (Dicksonia)
Tree Fern Sapling (Dicksonia)=Pousse de fougère en couronne (Dicksonia)

View File

@ -1,16 +1,23 @@
# textdomain: ferns
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
Fiddlehead=
Roasted Fiddlehead=
Fern Tuber=
Roasted Fern Tuber=
Lady-fern (Athyrium)=
Tree Fern Crown (Dicksonia)=
Giant Tree Fern Leaves=
Giant Tree Fern Leave End=
Giant Fern Trunk=
Giant Tree Fern Sapling=
Tree Fern Crown (Dicksonia)=
Young Horsetail (Equisetum) @1=
Young Horsetail (Equisetum)=
Horsetail (Equisetum)=
Horsetail (Equisetum) @1=
Fern Trunk (Dicksonia)=
Tree Fern Sapling (Dicksonia)=

View File

@ -11,8 +11,6 @@ local S = minetest.get_translator("ferns")
assert(abstract_ferns.config.enable_treefern == true)
local random = math.random
function abstract_ferns.can_grow_tree_fern(pos)
local node_name = minetest.get_node(pos).name
if node_name ~= "air" and node_name ~= "ferns:sapling_tree_fern" and node_name ~= "default:junglegrass" then
@ -41,12 +39,12 @@ abstract_ferns.grow_tree_fern = function(pos)
return
end
local size = random(1, 4) + random(1, 4)
local size = math.random(1, 4) + math.random(1, 4)
if (size > 5) then
size = 10 - size
end
size = size + 1
local crown = ({ "ferns:tree_fern_leaves", "ferns:tree_fern_leaves_02" })[random(1, 2)]
local crown = ({ "ferns:tree_fern_leaves", "ferns:tree_fern_leaves_02" })[math.random(1, 2)]
local i = 1
local brk = false
@ -160,9 +158,13 @@ minetest.register_node("ferns:fern_trunk", {
},
groups = {tree=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
sounds = default.node_sound_wood_defaults(),
after_dig_node = function(pos, node, metadata, digger)
default.dig_up(pos, node, digger)
end,
after_destruct = function(pos,oldnode)
local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})
if node.name == "ferns:fern_trunk" then
minetest.dig_node({x=pos.x,y=pos.y+1,z=pos.z})
minetest.add_item(pos,"ferns:fern_trunk")
end
end,
})
-----------------------------------------------------------------------------------------------

View File

@ -1 +1 @@
min_minetest_version = 5.3.0
min_minetest_version = 5.2.0

0
modpack.txt Normal file
View File

View File

@ -1,12 +1,20 @@
-----------------------------------------------------------------------------------------------
-- Idea by Sokomine
-- Code & textures by Mossmanikin
abstract_molehills = {}
local molehills_rarity = tonumber(minetest.settings:get("molehills_rarity")) or 99.5
local molehills_rarity_fertility = tonumber(minetest.settings:get("molehills_rarity_fertility")) or 1
local molehills_fertility = tonumber(minetest.settings:get("molehills_fertility")) or -0.6
-- support for i18n
local S = minetest.get_translator("molehills")
-----------------------------------------------------------------------------------------------
-- NoDe
-----------------------------------------------------------------------------------------------
local molehill_rarity = minetest.settings:get("molehills.molehill_rarity") or 0.002
-- Node
local mh_cbox = {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, -0.125, 0.5}
@ -26,7 +34,9 @@ minetest.register_node("molehills:molehill",{
sounds = default.node_sound_dirt_defaults(),
})
-- Crafting
-----------------------------------------------------------------------------------------------
-- CRaFTiNG
-----------------------------------------------------------------------------------------------
minetest.register_craft({ -- molehills --> dirt
output = "default:dirt",
recipe = {
@ -35,19 +45,31 @@ minetest.register_craft({ -- molehills --> dirt
}
})
-- Generating
minetest.register_decoration({
decoration = {
"molehills:molehill"
-----------------------------------------------------------------------------------------------
-- GeNeRaTiNG
-----------------------------------------------------------------------------------------------
abstract_molehills.place_molehill = function(pos)
local right_here = {x=pos.x , y=pos.y+1, z=pos.z }
if minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z }).name ~= "air"
and minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z }).name ~= "air"
and minetest.get_node({x=pos.x , y=pos.y, z=pos.z+1}).name ~= "air"
and minetest.get_node({x=pos.x , y=pos.y, z=pos.z-1}).name ~= "air"
and minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z+1}).name ~= "air"
and minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z-1}).name ~= "air"
and minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z+1}).name ~= "air"
and minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z-1}).name ~= "air" then
minetest.swap_node(right_here, {name="molehills:molehill"})
end
end
pl.register_on_generate({
surface = {"default:dirt_with_grass"},
noise_params = pl.generate_noise_params({rarity = molehills_rarity, rarity_fertility = molehills_rarity_fertility}),
min_elevation = 1,
max_elevation = 40,
avoid_nodes = {"group:tree","group:liquid","group:stone","group:falling_node"},
avoid_radius = 4,
},
fill_ratio = molehill_rarity,
y_min = 1,
y_max = 40,
place_on = {
"default:dirt_with_grass"
},
spawn_by = "air",
num_spawn_by = 3,
deco_type = "simple",
flags = "all_floors",
})
"molehills:molehills",
abstract_molehills.place_molehill
)

View File

@ -1,2 +1,9 @@
# textdomain: molehills
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# reusityback, 2022.
#
Mole Hill=Maulwurfshügel

View File

@ -1,2 +1,9 @@
# textdomain: molehills
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jolesh, 2022.
#
Mole Hill=Talpa Monteto

View File

@ -1,2 +1,9 @@
# textdomain: molehills
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# fat115 <fat115@framasoft.org>, 2017.
#
Mole Hill=Taupinière

View File

@ -1,2 +1,9 @@
# textdomain: molehills
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
Mole Hill=

View File

@ -1,2 +1,2 @@
name = molehills
depends = default
depends = default, biome_lib

View File

@ -1,2 +1,8 @@
# Molehill rarity (higher number -> higher probability)
molehills.molehill_rarity (Molehill rarity) float 0.002 0.0001 1
#Molehills rarity %
molehills_rarity (Molehills rarity %) float 99.5 0 100
#How much the rarity is reduced by fertility %
molehills_rarity_fertility (Molehills rarity fertility reduction %) float 1 0 100
#Molehills minimum fertility (-1 to +1)
molehills_fertility (Molehills minimum fertility) float -0.6 -1 1

View File

@ -2,8 +2,6 @@
local S = minetest.get_translator("nature_classic")
-- Blossoms and such
local random = math.random
local function spawn_apple_under(pos)
local below = {
x = pos.x,
@ -48,7 +46,7 @@ minetest.register_abm({
chance = nature.leaves_blossom_chance,
action = function(pos, node, active_object_count, active_object_count_wider)
if random(nature.leaves_blossom_chance) == 1 then
if math.random(nature.leaves_blossom_chance) == 1 then
nature.enqueue_node(pos, node, nature.blossom_node)
end
end
@ -63,7 +61,7 @@ minetest.register_abm({
chance = nature.blossom_leaves_chance,
action = function(pos, node, active_object_count, active_object_count_wider)
if random(nature.blossom_leaves_chance) == 1 then
if math.random(nature.blossom_leaves_chance) == 1 then
nature.enqueue_node(pos, node, nature.blossom_leaves)
end
end
@ -78,7 +76,7 @@ minetest.register_abm({
chance = nature.apple_chance,
action = function(pos, node, active_object_count, active_object_count_wider)
if random(4) == 1 and nature.dtime < 0.2 and not minetest.find_node_near(pos, nature.apple_spread, { "default:apple" }) then
if math.random(4) == 1 and nature.dtime < 0.2 and not minetest.find_node_near(pos, nature.apple_spread, { "default:apple" }) then
spawn_apple_under(pos)
end
end

View File

@ -2,7 +2,7 @@
local function process_blossom_queue_item()
local pos = nature.blossomqueue[1][1]
-- local node = nature.blossomqueue[1][2]
local node = nature.blossomqueue[1][2]
local replace = nature.blossomqueue[1][3]
if (nature.blossomqueue[1][3] == nature.blossom_node and not nature:is_near_water(pos)) then
table.remove(nature.blossomqueue, 1) -- don't grow if it's not near water, pop from queue.
@ -32,7 +32,7 @@ end)
function nature.enqueue_node(pos, node, replace)
local idx = #nature.blossomqueue
if idx < nature.blossomqueue_max then
local enqueue_prob
local enqueue_prob = 0
if idx < nature.blossomqueue_max * 0.8 then
enqueue_prob = 1
else

View File

@ -6,6 +6,8 @@
local current_mod_name = minetest.get_current_modname()
nature = {}
-- support for i18n
local S = minetest.get_translator("nature_classic")
nature.blossomqueue = {}
nature.blossomqueue_max = 1000
@ -23,7 +25,7 @@ if minetest.get_modpath("moretrees") then
nature.blossom_node = "moretrees:apple_blossoms"
nature.blossom_leaves = "moretrees:apple_tree_leaves"
nature.blossom_textures = { "moretrees_apple_tree_leaves.png^nature_blossom.png" }
nature.blossom_groups = { snappy = 3, leafdecay = 1, leaves = 1, flammable = 2, moretrees_leaves = 1 }
nature.blossom_groups = { snappy = 3, leafdecay = 1, leaves = 1, flammable = 2, moretrees_leaves = 1 },
minetest.register_alias("nature:blossom", "default:leaves")
end
@ -37,8 +39,12 @@ nature.apple_spread = 2
nature.meta_blossom_time = "blossom_time"
nature.blossom_duration = nature.blossom_delay
function dumppos(pos)
return "("..pos.x..","..pos.y..","..pos.z..")"
end
dofile(minetest.get_modpath(current_mod_name) .. "/config.lua")
dofile(minetest.get_modpath(current_mod_name) .. "/global_function.lua")
dofile(minetest.get_modpath(current_mod_name) .. "/blossom.lua")
minetest.log("action", S("[Nature Classic] loaded!"))
minetest.log("info", S("[Nature Classic] loaded!"))

View File

@ -1,2 +1,10 @@
# textdomain: nature_classic
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# reusityback, 2022.
#
Apple blossoms=Apfelblüten
[Nature Classic] loaded!=[Nature Classic] geladen!

View File

@ -1,2 +1,10 @@
# textdomain: nature_classic
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# fat115 <fat115@framasoft.org>, 2017.
#
Apple blossoms=Fleurs de pommier
[Nature Classic] loaded!=[Nature Classic] chargé.!

View File

@ -1,2 +1,10 @@
# textdomain: nature_classic
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
Apple blossoms=
[Nature Classic] loaded!=

View File

@ -1,11 +1,11 @@
-- support for i18n
local S = minetest.get_translator("pl_seaweed")
local seaweed_rarity = minetest.settings:get("pl_seaweed.seaweed_rarity") or 0.06
pl_seaweed = {}
local seaweed_max_count = tonumber(minetest.settings:get("pl_seaweed_max_count")) or 320
local seaweed_rarity = tonumber(minetest.settings:get("pl_seaweed_rarity")) or 33
local function get_ndef(name)
return minetest.registered_nodes[name] or {}
end
local algae_list = { {nil}, {2}, {3}, {4} }
@ -47,11 +47,7 @@ for i in ipairs(algae_list) do
liquids_pointable = true,
drop = "flowers:seaweed",
on_place = function(itemstack, placer, pointed_thing)
if not itemstack or not placer or not pointed_thing then
return
end
local keys = placer:get_player_control()
local keys=placer:get_player_control()
local pt = pointed_thing
local place_pos = nil
@ -59,21 +55,22 @@ for i in ipairs(algae_list) do
local under_node = minetest.get_node(pt.under)
local above_node = minetest.get_node(pt.above)
local top_node = minetest.get_node(top_pos)
if get_ndef(under_node.name)["buildable_to"] then
if pl.get_nodedef_field(under_node.name, "buildable_to") then
if under_node.name ~= "default:water_source" then
place_pos = pt.under
elseif top_node.name ~= "default:water_source" and get_ndef(top_node.name)["buildable_to"] then
elseif top_node.name ~= "default:water_source"
and pl.get_nodedef_field(top_node.name, "buildable_to") then
place_pos = top_pos
else
return
end
elseif get_ndef(above_node.name)["buildable_to"] then
elseif pl.get_nodedef_field(above_node.name, "buildable_to") then
place_pos = pt.above
end
if not place_pos then return end -- something went wrong :P
local pname = placer:get_player_name()
if not minetest.is_protected(place_pos, pname) then
if not minetest.is_protected(place_pos, placer:get_player_name()) then
local nodename = "default:cobble" -- :D
@ -95,46 +92,78 @@ for i in ipairs(algae_list) do
minetest.swap_node(place_pos, {name = "flowers:seaweed", param2 = fdir})
end
if not minetest.is_creative_enabled(pname) then
if not pl.expect_infinite_stacks then
itemstack:take_item()
end
return itemstack
end
end,
})
minetest.register_decoration({
name = "flowers:seaweed"..num,
decoration = {"flowers:seaweed"..num},
place_on = {"default:water_source"},
deco_type = "simple",
flags = "liquid_surface",
spawn_by = {"default:dirt_with_grass", "default:sand"},
num_spawn_by = 1,
fill_ratio = seaweed_rarity,
check_offset = -1,
y_min = 1,
y_max = 1,
})
minetest.register_decoration({
name = "flowers:seaweed"..num .."_sand",
decoration = {"flowers:seaweed"..num},
place_on = {"default:sand"},
deco_type = "simple",
flags = "all_floors",
spawn_by = "default:water_source",
num_spawn_by = 1,
fill_ratio = seaweed_rarity*1.2,
check_offset = -1,
y_min = 1,
y_max = 1,
})
end
minetest.register_alias("flowers:flower_seaweed", "flowers:seaweed")
minetest.register_alias("along_shore:pondscum_1", "flowers:seaweed")
minetest.register_alias("along_shore:seaweed_1", "flowers:seaweed")
minetest.register_alias("along_shore:seaweed_2", "flowers:seaweed_2")
minetest.register_alias("along_shore:seaweed_3", "flowers:seaweed_3")
minetest.register_alias("along_shore:seaweed_4", "flowers:seaweed_4")
pl_seaweed.grow_seaweed = function(pos)
local right_here = {x=pos.x, y=pos.y+1, z=pos.z}
local seaweed = math.random(1,4)
local node_name = "flowers:seaweed"
if seaweed > 1 then
node_name = node_name .. "_" .. seaweed
end
minetest.swap_node(right_here, {name=node_name, param2=math.random(1,3)})
end
biome_lib.register_on_generate({
surface = {"default:water_source"},
max_count = seaweed_max_count,
rarity = seaweed_rarity,
min_elevation = 1,
max_elevation = 40,
near_nodes = {"default:dirt_with_grass"},
near_nodes_size = 4,
near_nodes_vertical = 1,
near_nodes_count = 1,
plantlife_limit = -0.9,
},
pl_seaweed.grow_seaweed
)
-- pl_seaweed at beaches
-- MM: not satisfied with it, but IMHO some beaches should have some algae
biome_lib.register_on_generate({
surface = {"default:water_source"},
max_count = seaweed_max_count,
rarity = seaweed_rarity,
min_elevation = 1,
max_elevation = 40,
near_nodes = {"default:sand"},
near_nodes_size = 1,
near_nodes_vertical = 0,
near_nodes_count = 3,
plantlife_limit = -0.9,
temp_max = -0.64, -- MM: more or less random values, just to make sure it's not everywhere
temp_min = -0.22, -- MM: more or less random values, just to make sure it's not everywhere
},
pl_seaweed.grow_seaweed
)
biome_lib.register_on_generate({
surface = {"default:sand"},
max_count = seaweed_max_count*2,
rarity = seaweed_rarity/2,
min_elevation = 1,
max_elevation = 40,
near_nodes = {"default:water_source"},
near_nodes_size = 1,
near_nodes_vertical = 0,
near_nodes_count = 3,
plantlife_limit = -0.9,
temp_max = -0.64, -- MM: more or less random values, just to make sure it's not everywhere
temp_min = -0.22, -- MM: more or less random values, just to make sure it's not everywhere
},
pl_seaweed.grow_seaweed
)
minetest.register_alias( "flowers:flower_seaweed" , "flowers:seaweed" )
minetest.register_alias( "along_shore:pondscum_1" , "flowers:seaweed" )
minetest.register_alias( "along_shore:seaweed_1" , "flowers:seaweed" )
minetest.register_alias( "along_shore:seaweed_2" , "flowers:seaweed_2" )
minetest.register_alias( "along_shore:seaweed_3" , "flowers:seaweed_3" )
minetest.register_alias( "along_shore:seaweed_4" , "flowers:seaweed_4" )

View File

@ -1,2 +1,11 @@
# textdomain: pl_seaweed
Seaweed=Seegras
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Xanthin, 2017.
#
Seaweed=Seetang

View File

@ -1,2 +1,10 @@
# textdomain: pl_seaweed
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# fat115 <fat115@framasoft.org>, 2017.
#
Seaweed=Algues

View File

@ -1,2 +1,10 @@
# textdomain: pl_seaweed
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# mahmutelmas06@hotmail.com, 2017.
#
Seaweed=Deniz yosunu

View File

@ -1,2 +1,11 @@
# textdomain: pl_seaweed
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jolesh, 2022.
#
Seaweed=Algo

View File

@ -1,2 +1,10 @@
# textdomain: pl_seaweed
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Carlos Barraza <carlosbarrazaes@gmail.com>, 2017.
#
Seaweed=Algas marinas

View File

@ -1,2 +1,11 @@
# textdomain: pl_seaweed
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
Seaweed=

View File

@ -1,2 +1,3 @@
name = pl_seaweed
depends = biome_lib
optional_depends = farming, flowers

View File

@ -1,2 +1,5 @@
# Seaweed rarity (higher number -> higher probability)
pl_seaweed.seaweed_rarity (Seaweed rarity) float 0.06 0.0001 1
#Seaweed maximum count
pl_seaweed_max_count (Seaweed maximum count) int 320 1 1000
#Seaweed rarity
pl_seaweed_rarity (Seaweed rarity) int 33 0 100

View File

@ -1,7 +1,9 @@
-- support for i18n
local S = minetest.get_translator("pl_sunflowers")
local sunflower_rarity = minetest.settings:get("pl_sunflowers.sunflower_rarity") or 0.005
local sunflowers_max_count = tonumber(minetest.settings:get("pl_sunflowers_max_count")) or 10
local sunflowers_rarity = tonumber(minetest.settings:get("pl_sunflowers_rarity")) or 25
local box = {
type="fixed",
@ -17,7 +19,7 @@ minetest.register_node(":flowers:sunflower", {
description = S("Sunflower"),
drawtype = "mesh",
paramtype = "light",
paramtype2 = "degrotate",
paramtype2 = "facedir",
inventory_image = "flowers_sunflower_inv.png",
mesh = "flowers_sunflower.obj",
tiles = { "flowers_sunflower.png" },
@ -38,20 +40,17 @@ minetest.register_node(":flowers:sunflower", {
}
})
minetest.register_decoration({
decoration = {
"flowers:sunflower"
biome_lib.register_on_generate({
surface = {"default:dirt_with_grass"},
avoid_nodes = { "flowers:sunflower" },
max_count = sunflowers_max_count,
rarity = sunflowers_rarity,
min_elevation = 0,
plantlife_limit = -0.9,
temp_max = -0.1,
random_facedir = {0,3},
},
fill_ratio = sunflower_rarity,
y_min = 1,
y_max = 40,
param2 = 0,
param2_max = 239,
place_on = {
"default:dirt_with_grass"
},
deco_type = "simple",
flags = "all_floors",
})
"flowers:sunflower"
)
minetest.register_alias("sunflower:sunflower", "flowers:sunflower")

View File

@ -1,2 +1,11 @@
# textdomain: pl_sunflowers
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Xanthin, 2017.
#
Sunflower=Sonnenblume

View File

@ -1,2 +1,11 @@
# textdomain: pl_sunflowers
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jolesh, 2022.
#
Sunflower=Sunfloro

View File

@ -1,2 +1,10 @@
# textdomain: pl_sunflowers
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Carlos Barraza <carlosbarrazaes@gmail.com>, 2017.
#
Sunflower=Girasol

View File

@ -1,2 +1,10 @@
# textdomain: pl_sunflowers
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# fat115 <fat115@framasoft.org>, 2017.
#
Sunflower=Tournesol

View File

@ -1,2 +1,10 @@
# textdomain: pl_sunflowers
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# mahmutelmas06@hotmail.com, 2017.
#
Sunflower=Ayçiçeği

View File

@ -1,2 +1,11 @@
# textdomain: pl_sunflowers
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
Sunflower=

View File

@ -1,2 +1,3 @@
name = pl_sunflowers
depends = biome_lib
optional_depends = farming, flowers

View File

@ -1,2 +1,5 @@
# Sunflower rarity (higher number -> higher probability)
pl_sunflowers.sunflower_rarity (Sunflower rarity) float 0.005 0.0001 1
#Sunflowers maximum count
pl_sunflowers_max_count (Sunflowers maximum count) int 10 1 1000
#Sunflowers rarity
pl_sunflowers_rarity (Sunflowers rarity) int 25 0 100

View File

@ -1,11 +1,11 @@
-- support for i18n
local S = minetest.get_translator("pl_waterlilies")
local fill_ratio = minetest.settings:get("pl_waterlilies.waterlily_rarity") or 0.03
pl_waterlilies = {}
local lilies_max_count = tonumber(minetest.settings:get("pl_waterlilies_max_count")) or 320
local lilies_rarity = tonumber(minetest.settings:get("pl_waterlilies_rarity")) or 33
local function get_ndef(name)
return minetest.registered_nodes[name] or {}
end
local lilies_list = {
{ nil , nil , 1 },
@ -18,15 +18,6 @@ local lilies_list = {
{ "s4" , "small_4" , 8 },
}
local lilynames_list = {}
for i in ipairs(lilies_list) do
local deg1 = ""
if lilies_list[i][1] ~= nil then
deg1 = "_"..lilies_list[i][1]
end
table.insert(lilynames_list, "flowers:waterlily"..deg1)
end
for i in ipairs(lilies_list) do
local deg1 = ""
local deg2 = ""
@ -68,11 +59,7 @@ for i in ipairs(lilies_list) do
liquids_pointable = true,
drop = "flowers:waterlily",
on_place = function(itemstack, placer, pointed_thing)
if not itemstack or not placer or not pointed_thing then
return
end
local keys = placer:get_player_control()
local keys=placer:get_player_control()
local pt = pointed_thing
local place_pos = nil
@ -81,24 +68,25 @@ for i in ipairs(lilies_list) do
local above_node = minetest.get_node(pt.above)
local top_node = minetest.get_node(top_pos)
if get_ndef(under_node.name)["buildable_to"] then
if biome_lib.get_nodedef_field(under_node.name, "buildable_to") then
if under_node.name ~= "default:water_source" then
place_pos = pt.under
elseif top_node.name ~= "default:water_source" and get_ndef(top_node.name)["buildable_to"] then
elseif top_node.name ~= "default:water_source"
and biome_lib.get_nodedef_field(top_node.name, "buildable_to") then
place_pos = top_pos
else
return
end
elseif get_ndef(above_node.name)["buildable_to"] then
elseif biome_lib.get_nodedef_field(above_node.name, "buildable_to") then
place_pos = pt.above
end
local pname = placer:get_player_name()
if place_pos and not minetest.is_protected(place_pos, pname) then
if place_pos and not minetest.is_protected(place_pos, placer:get_player_name()) then
local nodename = "default:cobble" -- if this block appears, something went....wrong :-)
if not keys["sneak"] then
local node = minetest.get_node(pt.under)
local waterlily = math.random(1,8)
if waterlily == 1 then
nodename = "flowers:waterlily"
@ -123,63 +111,55 @@ for i in ipairs(lilies_list) do
minetest.swap_node(place_pos, {name = "flowers:waterlily", param2 = fdir})
end
if not minetest.is_creative_enabled(pname) then
if not biome_lib.expect_infinite_stacks then
itemstack:take_item()
end
return itemstack
end
end,
})
minetest.register_decoration({
name = "flowers:waterlily"..deg1,
decoration = {"flowers:waterlily"..deg1},
place_on = {"default:water_source"},
deco_type = "simple",
flags = "liquid_surface",
spawn_by = "default:sand",
num_spawn_by = 1,
fill_ratio = fill_ratio,
check_offset = -1,
y_min = 1,
y_max = 1,
})
minetest.register_decoration({
name = "flowers:waterlily"..deg1 .."_relative",
decoration = {"flowers:waterlily"..deg1},
place_on = {"default:water_source"},
deco_type = "simple",
flags = "liquid_surface",
spawn_by = lilynames_list,
num_spawn_by = 1,
fill_ratio = fill_ratio*1.25,
check_offset = -1,
y_min = 1,
y_max = 1,
})
minetest.register_decoration({
name = "flowers:waterlily"..deg1 .."_relative",
decoration = {"flowers:waterlily"..deg1},
place_on = {"default:water_source"},
deco_type = "simple",
flags = "liquid_surface",
spawn_by = lilynames_list,
num_spawn_by = 1,
fill_ratio = fill_ratio*1.5,
check_offset = -1,
y_min = 1,
y_max = 1,
})
end
pl_waterlilies.grow_waterlily = function(pos)
local right_here = {x=pos.x, y=pos.y+1, z=pos.z}
for i in ipairs(lilies_list) do
local chance = math.random(1,8)
local ext = ""
local num = lilies_list[i][3]
if lilies_list[i][1] ~= nil then
ext = "_"..lilies_list[i][1]
end
if chance == num then
minetest.swap_node(right_here, {name="flowers:waterlily"..ext, param2=math.random(0,3)})
end
end
end
biome_lib.register_on_generate({
surface = {"default:water_source"},
max_count = lilies_max_count,
rarity = lilies_rarity,
min_elevation = 1,
max_elevation = 40,
near_nodes = {"default:dirt_with_grass"},
near_nodes_size = 4,
near_nodes_vertical = 1,
near_nodes_count = 1,
plantlife_limit = -0.9,
temp_max = -0.22,
temp_min = 0.22,
},
pl_waterlilies.grow_waterlily
)
minetest.register_alias( "flowers:flower_waterlily", "flowers:waterlily")
minetest.register_alias( "flowers:flower_waterlily_225", "flowers:waterlily_225")
minetest.register_alias( "flowers:flower_waterlily_45", "flowers:waterlily_45")
minetest.register_alias( "flowers:flower_waterlily_675", "flowers:waterlily_675")
minetest.register_alias( "trunks:lilypad", "flowers:waterlily_s1")
minetest.register_alias( "along_shore:lilypads_1", "flowers:waterlily_s1")
minetest.register_alias( "along_shore:lilypads_2", "flowers:waterlily_s2")
minetest.register_alias( "along_shore:lilypads_3", "flowers:waterlily_s3")
minetest.register_alias( "along_shore:lilypads_4", "flowers:waterlily_s4")
minetest.register_alias( "trunks:lilypad" , "flowers:waterlily_s1" )
minetest.register_alias( "along_shore:lilypads_1" , "flowers:waterlily_s1" )
minetest.register_alias( "along_shore:lilypads_2" , "flowers:waterlily_s2" )
minetest.register_alias( "along_shore:lilypads_3" , "flowers:waterlily_s3" )
minetest.register_alias( "along_shore:lilypads_4" , "flowers:waterlily_s4" )

View File

@ -1,2 +1,11 @@
# textdomain: pl_waterlilies
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Xanthin, 2017.
#
Waterlily=Seerose

View File

@ -1,2 +1,11 @@
# textdomain: pl_waterlilies
# textdomain: pl_waterlillies
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jolesh, 2022.
#
Waterlily=Akvolilio

View File

@ -1,2 +1,10 @@
# textdomain: pl_waterlilies
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Carlos Barraza <carlosbarrazaes@gmail.com>, 2017.
#
Waterlily=Lirio de agua

View File

@ -1,2 +1,10 @@
# textdomain: pl_waterlilies
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# fat115 <fat115@framasoft.org>, 2017.
#
Waterlily=Nénuphar

View File

@ -1,2 +1,10 @@
# textdomain: pl_waterlilies
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# mahmutelmas06@hotmail.com, 2017.
#
Waterlily=Nilüfer

View File

@ -1,2 +1,11 @@
# textdomain: pl_waterlilies
# textdomain: pl_waterlillies
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
Waterlily=

View File

@ -1,2 +1,3 @@
name = pl_waterlilies
depends = biome_lib
optional_depends = farming, flowers

View File

@ -1,2 +1,5 @@
# Waterlily rarity (higher number -> higher probability)
pl_waterlilies.waterlily_rarity (Waterlily rarity) float 0.03 0.0001 1
#Water-lilies maximum count
pl_waterlilies_max_count (Water-lilies maximum count) int 320 1 1000
#Water-lilies rarity
pl_waterlilies_rarity (Water-lilies rarity) int 33 0 100

167
plantlife_lib/init.lua Normal file
View File

@ -0,0 +1,167 @@
pl = {}
local deco = {}
dofile(minetest.get_modpath("plantlife_lib") .. DIR_DELIM .. "util.lua")
function pl.get_def_from_id(id)
for i, _ in ipairs(deco) do
if deco[i][1].id and deco[i][1].id == id then
return deco[i]
end
end
end
function pl.register_on_generate(def, plantname, func)
local deco_def = {
name = plantname,
deco_type = "simple",
place_on = def.place_on or def.surface,
sidelen = 16,
fill_ratio = def.fill_ratio or 0.02,
noise_params = def.noise_params,
y_min = def.min_elevation,
y_max = def.max_elevation,
flags = def.flags,
decoration = "air", -- spawn the decoration later
}
-- handle avoid_nodes (no engine support :\)
if def.avoid_nodes then
deco_def.avoid_nodes = def.avoid_nodes
if def.avoid_radius then
deco_def.avoid_radius = def.avoid_radius
end
end
-- handle near_nodes (we can't use the engine function for that)
if def.near_nodes then
deco_def.near_nodes = def.near_nodes
if def.near_nodes_size then
deco_def.near_nodes_size = def.near_nodes_size
if def.near_nodes_vertical then
deco_def.near_nodes_vertical = def.near_nodes_vertical
end
end
deco_def.near_nodes_count = def.near_nodes_count or 1
end
-- handle ncount/neighbors
if def.ncount and def.neighbors then
deco_def.ncount = def.ncount
deco_def.neighbors = def.neighbors
end
-- save def
local next = #deco + 1
deco[next] = {}
deco[next][1] = deco_def
deco[next][2] = func or nil
minetest.register_decoration(deco_def)
-- print(dump(deco))
end
local ids = {}
minetest.register_on_mods_loaded(function()
-- print(dump(deco))
for k, v in ipairs(deco) do
local id = minetest.get_decoration_id(deco[k][1].name)
deco[k][1].id = id
table.insert(ids, id)
end
print(dump2(ids))
minetest.set_gen_notify("decoration", ids)
-- print(dump(deco))
end)
local function place_handler(t)
local def = pl.get_def_from_id(t.id)
-- ncount/neighbors handler
if def.ncount and
#minetest.find_nodes_in_area(
{x = t.pos.x-1, y = t.pos.y, z = t.pos.z-1},
{x = t.pos.x+1, y = t.pos.y, z = t.pos.z+1},
def.neighbors
) <= def.ncount then
print("return due ncount")
return -- Not enough similar biome nodes around
end
-- near nodes handler
if def.near_nodes and
#minetest.find_nodes_in_area(
{x = t.pos.x-def.near_nodes_size, y = t.pos.y-def.near_nodes_vertical, z = t.pos.z-def.near_nodes_size},
{x = t.pos.x+def.near_nodes_size, y = t.pos.y+def.near_nodes_vertical, z = t.pos.z+def.near_nodes_size},
def.near_nodes
) < def.near_nodes_count then
return -- Long distance neighbors do not match
end
-- avoid nodes handler
if def.avoid_nodes and def.avoid_radius then
local p_top = {x = t.pos.x, y = t.pos.y + 1, z = t.pos.z}
if minetest.find_node_near(p_top, def.avoid_radius + math.random(-1.5,2), def.avoid_nodes) then
return
end
end
-- run spawn function
local spawn_func = def[2]
spawn_func(t.pos)
-- some fun
local player = minetest.get_player_by_name("Niklp")
-- player:set_pos(t.pos)
t.pos.y = t.pos.y + 3
minetest.add_particle({
pos = t.pos,
expirationtime = 15,
playername = player:get_player_name(),
glow = minetest.LIGHT_MAX,
texture = "default_mese_crystal.png",
size = 15,
})
end
minetest.register_on_generated(function(minp, maxp, blockseed)
local t0 = minetest.get_us_time()
local g = minetest.get_mapgen_object("gennotify")
local locations = {}
for _, id in ipairs(ids) do
local deco_locations = g["decoration#" .. id] or {}
-- print("dl: " .. dump2(deco_locations))
for k, pos in pairs(deco_locations) do
-- print(id)
local next = #locations + 1
locations[next] = {}
locations[next].pos = pos
locations[next].id = id
-- dbg() ^ - This must be ID!
end
end
if #locations == 0 then return end
-- print("locations: " .. dump2(locations))
for _, t in ipairs(locations) do
place_handler(t)
end
local t1 = minetest.get_us_time()
print((t1 - t0) / 1000 .. " ms")
end)
--[[ Example plant
{
{
y_min = 1,
decoration = "air",
deco_type = "simple",
id = 45,
name = "bushes:bushes_1",
place_on = {
"default:dirt_with_grass",
"stoneage:grass_with_silex",
"sumpf:peat",
"sumpf:sumpf"
},
sidelen = 16,
fill_ratio = 0.001
},
^ - decoration def; object ID
<function>
}, ^ - spawn function
]]--

2
plantlife_lib/mod.conf Normal file
View File

@ -0,0 +1,2 @@
name = plantlife_lib
optional_depends = dbg

42
plantlife_lib/util.lua Normal file
View File

@ -0,0 +1,42 @@
-- Biome lib util functions
function pl.get_nodedef_field(nodename, fieldname)
if not minetest.registered_nodes[nodename] then
return nil
end
return minetest.registered_nodes[nodename][fieldname]
end
if minetest.get_modpath("unified_inventory") or not minetest.settings:get_bool("creative_mode") then
pl.expect_infinite_stacks = false
else
pl.expect_infinite_stacks = true
end
-- Noise param helper
local function set_defaults(biome)
biome.seed_diff = biome.seed_diff or 0
biome.rarity = biome.rarity or 50
biome.rarity_fertility = biome.rarity_fertility or 0
biome.max_count = biome.max_count or 125
return biome
end
function pl.generate_noise_params(b)
local biome = set_defaults(b)
local r = (100-biome.rarity)/100
local mc = math.min(biome.max_count, 6400)/6400
local noise_params = {
octaves = biome_lib.fertile_perlin_octaves,
persist = biome_lib.fertile_perlin_persistence * (100/biome_lib.fertile_perlin_scale),
scale = math.min(r, mc),
seed = biome.seed_diff,
offset = 0,
spread = {x = 100, y = 100, z = 100},
lacunarity = 2,
flags = "absvalue"
}
return noise_params
end

Some files were not shown because too many files have changed in this diff Show More