summaryrefslogtreecommitdiff
path: root/nature_classic
diff options
context:
space:
mode:
Diffstat (limited to 'nature_classic')
-rw-r--r--nature_classic/blossom.lua75
-rw-r--r--nature_classic/config.lua6
-rw-r--r--nature_classic/depends.txt2
-rw-r--r--nature_classic/global_function.lua82
-rw-r--r--nature_classic/init.lua41
-rw-r--r--nature_classic/textures/nature_blossom.pngbin0 -> 115 bytes
6 files changed, 206 insertions, 0 deletions
diff --git a/nature_classic/blossom.lua b/nature_classic/blossom.lua
new file mode 100644
index 0000000..62947b5
--- /dev/null
+++ b/nature_classic/blossom.lua
@@ -0,0 +1,75 @@
+-- Blossoms and such
+
+local function spawn_apple_under(pos)
+ local below = {
+ x = pos.x,
+ y = pos.y - 1,
+ z = pos.z,
+ }
+ if minetest.get_node(below).name == "air" then
+ minetest.set_node(below, { name = "default:apple" })
+ end
+end
+
+minetest.register_node(":"..nature.blossom_node, {
+ description = "Apple blossoms",
+ drawtype = "allfaces_optional",
+ tiles = nature.blossom_textures,
+ paramtype = "light",
+ groups = { snappy = 3, leafdecay = 3, flammable = 2, leafdecay = 3 },
+ sounds = default.node_sound_leaves_defaults(),
+ waving = 1
+})
+
+minetest.register_craft({
+ type = "fuel",
+ recipe = nature.blossom_node,
+ burntime = 2,
+})
+
+-- these ABMs can get heavy, so just enqueue the nodes
+
+-- Adding Blossoms
+-- Limit mass changes after block has not been loaded for some time:
+-- Run ABM with higher frequency, but don't enqueue all blocks
+minetest.register_abm({
+ nodenames = { nature.blossom_leaves },
+ interval = nature.blossom_delay / nature.leaves_blossom_chance,
+ chance = nature.leaves_blossom_chance,
+
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ if math.random(nature.leaves_blossom_chance) == 1 then
+ nature.enqueue_node(pos, node, nature.blossom_node)
+ end
+ end
+})
+
+-- Removing blossoms
+-- Limit mass changes after block has not been loaded for some time:
+-- Run ABM with higher frequency, but don't enqueue all blocks
+minetest.register_abm({
+ nodenames = { nature.blossom_node },
+ interval = nature.blossom_delay / nature.blossom_leaves_chance,
+ chance = nature.blossom_leaves_chance,
+
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ if math.random(nature.blossom_leaves_chance) == 1 then
+ nature.enqueue_node(pos, node, nature.blossom_leaves)
+ end
+ end
+})
+
+-- Spawning apples
+-- Limit mass changes after block has not been loaded for some time:
+-- spawn apples with 25% chance, but with 4 times higher frequency
+minetest.register_abm({
+ nodenames = { nature.blossom_node },
+ interval = nature.apple_delay / 4,
+ chance = nature.apple_chance,
+
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ 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
+})
diff --git a/nature_classic/config.lua b/nature_classic/config.lua
new file mode 100644
index 0000000..8f67b1c
--- /dev/null
+++ b/nature_classic/config.lua
@@ -0,0 +1,6 @@
+-- Set on which distance from water can the tree still grow.
+-- Grows anywhere if set to -1.
+nature.distance_from_water = 20
+
+-- Minimum light level needed to grow. Default is 8, which means daylight.
+nature.minimum_growth_light = 8
diff --git a/nature_classic/depends.txt b/nature_classic/depends.txt
new file mode 100644
index 0000000..1246684
--- /dev/null
+++ b/nature_classic/depends.txt
@@ -0,0 +1,2 @@
+default
+moretrees?
diff --git a/nature_classic/global_function.lua b/nature_classic/global_function.lua
new file mode 100644
index 0000000..3a5b9e3
--- /dev/null
+++ b/nature_classic/global_function.lua
@@ -0,0 +1,82 @@
+-- helper functions
+
+local function process_blossom_queue_item()
+ local pos = nature.blossomqueue[1][1]
+ 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.
+ return
+ end
+ nature:grow_node(pos, replace) -- now actually grow it.
+ table.remove(nature.blossomqueue, 1)
+end
+
+minetest.register_globalstep(function(dtime)
+ nature.dtime = dtime
+ if #nature.blossomqueue > 0 and dtime < 0.2 then
+ local i = 1
+ if dtime < 0.1 then
+ i = i + 4
+ end
+ if dtime < 0.05 then
+ i = i + 10
+ end
+ while #nature.blossomqueue > 0 and i > 0 do
+ process_blossom_queue_item()
+ i = i - 1
+ end
+ end
+end)
+
+function nature.enqueue_node(pos, node, replace)
+ local idx = #nature.blossomqueue
+ if idx < nature.blossomqueue_max then
+ local enqueue_prob = 0
+ if idx < nature.blossomqueue_max * 0.8 then
+ enqueue_prob = 1
+ else
+ -- Reduce queue growth as it gets closer to its max.
+ enqueue_prob = 1 - (idx - nature.blossomqueue_max * 0.8) / (nature.blossomqueue_max * 0.2)
+ end
+ if enqueue_prob == 1 or math.random(100) <= 100 * enqueue_prob then
+ nature.blossomqueue[idx+1] = {}
+ nature.blossomqueue[idx+1][1] = pos
+ nature.blossomqueue[idx+1][2] = node
+ nature.blossomqueue[idx+1][3] = replace
+ end
+ end
+end
+
+local function set_young_node(pos)
+ local meta = minetest.get_meta(pos)
+
+ meta:set_int(nature.meta_blossom_time, minetest.get_gametime())
+end
+
+local function is_not_young(pos)
+ local meta = minetest.get_meta(pos)
+
+ local blossom_time = meta:get_int(nature.meta_blossom_time)
+ return not (blossom_time and minetest.get_gametime() - blossom_time < nature.blossom_duration)
+end
+
+function nature:grow_node(pos, nodename)
+ if pos ~= nil then
+ local light_enough = (minetest.get_node_light(pos, nil) or 0)
+ >= nature.minimum_growth_light
+
+ if is_not_young(pos) and light_enough then
+ minetest.set_node(pos, { name = nodename })
+ set_young_node(pos)
+
+ minetest.log("info", nodename .. " has grown at " .. pos.x .. ","
+ .. pos.y .. "," .. pos.z)
+ end
+ end
+end
+
+function nature:is_near_water(pos)
+ return nature.distance_from_water == -1 or minetest.find_node_near(pos, nature.distance_from_water,
+ { "default:water_source" }) ~= nil
+end
diff --git a/nature_classic/init.lua b/nature_classic/init.lua
new file mode 100644
index 0000000..47fd9bf
--- /dev/null
+++ b/nature_classic/init.lua
@@ -0,0 +1,41 @@
+-- Nature Classic mod
+-- Originally by neko259
+
+-- Nature is slowly capturing the world!
+
+local current_mod_name = minetest.get_current_modname()
+
+nature = {}
+nature.blossomqueue = {}
+nature.blossomqueue_max = 1000
+
+nature.blossom_node = "nature:blossom"
+nature.blossom_leaves = "default:leaves"
+nature.blossom_textures = { "default_leaves.png^nature_blossom.png" }
+
+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" }
+ minetest.register_alias("nature:blossom", "default:leaves")
+end
+
+nature.leaves_blossom_chance = 15
+nature.blossom_leaves_chance = 5
+nature.blossom_delay = 3600
+nature.apple_delay = 3600
+nature.apple_chance = 10
+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("info", "[Nature Classic] loaded!")
diff --git a/nature_classic/textures/nature_blossom.png b/nature_classic/textures/nature_blossom.png
new file mode 100644
index 0000000..9d90336
--- /dev/null
+++ b/nature_classic/textures/nature_blossom.png
Binary files differ