initial commit
84
README
Normal file
@ -0,0 +1,84 @@
|
||||
README file for Plantlife mod, by Vanessa Ezekowitz
|
||||
---------------------------------------------------
|
||||
|
||||
Plantlife is a combined form of my Flowers, Jungle Grass, and Poison Ivy mods
|
||||
and has been significantly rewritten and re-organized. This mod supplies all
|
||||
three of these components and should be 100% compatible with mods that used the
|
||||
old versions.
|
||||
|
||||
Its purpose is to add various kinds of flowers, cotton plants, water foliage,
|
||||
poison ivy, and jungle grass in a few sizes. All of these are spawned as
|
||||
normal nodes and can be collected and used in any recipes that depend on the
|
||||
old mods.
|
||||
|
||||
Spawning of plandts is sensitive to the amount of available light. Flowers,
|
||||
cotton, and waterlilies only spawn when there at least a signficant amount of
|
||||
light. Seaweed will grow only in dimly-lit areas. Jungle grass and poison ivy
|
||||
also grow in the daytime, but require less light than flowers.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Important details:
|
||||
|
||||
Configuration: Any of the three components of this mod can be disabled by
|
||||
editing plants/init.lua, near the beginning of the file, and changing one or
|
||||
more of these lines to false:
|
||||
|
||||
local enable_flowers = true
|
||||
local enable_junglegrass = true
|
||||
local enable_poisonivy = true
|
||||
|
||||
Dependencies: Just the game's default stuff.
|
||||
|
||||
Recommends: Nothing in particular.
|
||||
|
||||
Conflicts: This mod should not be installed alongside the original Flowers,
|
||||
Jungle Grass, or Poison Ivy mods. If those exist, delete them, as this mod
|
||||
supplies all of their functionality.
|
||||
|
||||
Software Requirements: This mod was written for Minetest 0.4.4 or later, but it
|
||||
should work on pretty much any old or recent 0.4.x version. It will not work
|
||||
with 0.3.x since that version does not support modding.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Crafting:
|
||||
|
||||
Only Flowers have crafting recipes. For a flower pot, put three
|
||||
clay bricks in the crafting grid in a "v" shape like so (yields 1):
|
||||
|
||||
- - -
|
||||
B - B
|
||||
- B -
|
||||
|
||||
To put a flower into a pot, just put one of each into the crafting grid.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Notes:
|
||||
|
||||
Flowers has been completely rewritten, almost from scratch, using the most
|
||||
recent and advanced features the game engine has to offer. It should be
|
||||
significantly faster than the original Ironzorg Flowers mod. Flowers and
|
||||
cotton spawn on grass only, seaweed spawns on water or grass close to the
|
||||
shoreline, or on very small stone islands in water. Waterlilies of course
|
||||
spawn on water.
|
||||
|
||||
There are four different sizes of jungle grasses, all of which yield a single
|
||||
junglegrass object when gathered (so all four sizes may be used where jungle
|
||||
grass is called for). The largest size uses the game's standard jungle grass
|
||||
node, while the others are defined by this mod.
|
||||
|
||||
Junglegrass will spawn on grass, sand, desert sand and the tops of papyrus and
|
||||
cactus (though rarely), and will do so anywhere in the map. Grass on the
|
||||
ground will grow and eventually disappear (die), while grass in the desert will
|
||||
grow and eventually turn into dry shrubs.
|
||||
|
||||
Poison Ivy will spawn on grass and in some cases, on vertical surfaces
|
||||
including trees and jungle trees where they meet the dirt or grass. Ivy
|
||||
previously spawned on the ground taller/thicker or start climbing up said
|
||||
vertical surfaces and trees.
|
||||
|
||||
At present, the poison ivy presents little more than an annoyance - they can
|
||||
only be cut down and either re-planted or thrown away. No damage is done by
|
||||
harvesting them, yet. ;-)
|
60
README~
Normal file
@ -0,0 +1,60 @@
|
||||
--- README for Flowers:
|
||||
|
||||
This is a mostly-rewrite of Ironzorg's flowers mod, using more recent features
|
||||
in the game, to make the code perform better.
|
||||
|
||||
Dependencies: none (just the game's default stuff)
|
||||
|
||||
License: cc-by-sa 3.0 for the textures, WTFPL for everything else.
|
||||
|
||||
--- README for Jungle Grass:
|
||||
|
||||
Since recent versions of Minetest no longer contain jungle biomes, and
|
||||
hence no jungle grass, I created this mod to re-add said grass back into
|
||||
the game, with a twist: There are now four different sizes of grasses,
|
||||
all of which yield a single junglegrass object when gathered (so all
|
||||
four sizes may be used where jungle grass is called for). The largest
|
||||
size uses the game's standard jungle grass node, while the others are
|
||||
defined by this mod.
|
||||
|
||||
Junglegrass will spawn on dirt, grass, sand, desert sand and the tops of
|
||||
papyrus and cactus (though rarely), and will do so anywhere in the map.
|
||||
Grass on the ground will grow and eventually die (or turn into dry
|
||||
shrubs, in the desert), given enough time.
|
||||
|
||||
Adjusting the overall spawn/growth rate is easily done by tweaking the
|
||||
MAX_RATIO variable at the top of init.lua. A larger value results in
|
||||
less frequent events.
|
||||
|
||||
Dependencies: none (just the game's default stuff)
|
||||
|
||||
License: cc-by-sa 3.0 for the textures, WTFPL for everything else.
|
||||
|
||||
--- README for Poison Ivy:
|
||||
|
||||
This is a mod for minetest and its forks to add poison ivy.
|
||||
|
||||
Ivy will spawn on dirt or grass, and in some cases, on vertical
|
||||
surfaces, trees, and jungle trees where they meet the dirt or grass.
|
||||
Ivy previously spawned will occasionally grow taller/thicker or start
|
||||
climbing up said vertical surfaces and trees.
|
||||
|
||||
At present, the plants present little more than an annoyance - they can
|
||||
only be cut down and either re-planted or thrown away. No damage is
|
||||
done by harvesting them, yet. ;-)
|
||||
|
||||
Mod based on ironzorg's flowers mod; I left the spawn rates the same so
|
||||
the plants don't take over your world (in fact, they may take a few
|
||||
day/night cycles before you start to notice them). If you want a really
|
||||
overgrown environment just lower the MAX_RATIO and GROWING_DELAY
|
||||
variables at the top of init.lua.
|
||||
|
||||
Textures hand-drawn by me (16x16px).
|
||||
|
||||
License: WTFPL (applies to all parts)
|
||||
|
||||
Depends: None.
|
||||
|
||||
No crafting recipes (didn't see a point :-) ).
|
||||
|
||||
|
10
copyright.txt
Normal file
@ -0,0 +1,10 @@
|
||||
Ironzorg's Flowers mod served as the basis for the three mods that eventually
|
||||
went into creating this file. Any code still remaining from that mod is
|
||||
entirely his work (though I'm pretty sure it's all been phased out).
|
||||
|
||||
Flowers textures by Ironzorg.
|
||||
|
||||
Junglegrass textures are modified copies of the original one from the game's
|
||||
default set.
|
||||
|
||||
All remaining code, textures, etc. by Vanessa Ezekowitz.
|
24
flowers-changelog.txt
Normal file
@ -0,0 +1,24 @@
|
||||
Changelog
|
||||
---------
|
||||
|
||||
2012-08-06: Tweaked selection boxes on all nodes. Tweaked seaweed to use
|
||||
signlike instead of raillike drawtype, (still forced to only spawn flat as
|
||||
usual). Adjusted light level limits to give it more time to grow. Created
|
||||
this changelog file using github commit messages as the basis. Shrunk the
|
||||
geranium flower down a bit to better match the others.
|
||||
|
||||
2012-08-03: Tuned out the random-numbers-inside-ABM stuff. Uses the ABM's
|
||||
chance setting instead. Should be approximately the same as before, but
|
||||
hopefully using a tad less CPU. Minor tweak to ABM interval/growing delay.
|
||||
|
||||
2012-08-01: Added blue geranium to the collection of flowers.
|
||||
|
||||
2012-07-31: Disable debug by default.
|
||||
|
||||
2012-07-30: many updates over the course of the day - first commit, removed
|
||||
some redundant files, added wield/inventory image entries for each item, to
|
||||
force the game to draw them properly (these shouldn't be needed, must be a
|
||||
bug). Tweaked spawn code so that the radius check also includes the name of
|
||||
the item being spawned as well as items in group:flower, that way all items can
|
||||
have a radius test, and not just those in group:flower. Fiddled with the spawn
|
||||
rates a bit.
|
0
flowers/depends.txt
Normal file
0
flowers/init.lua
Normal file
24
junglegrass-changelog.txt
Normal file
@ -0,0 +1,24 @@
|
||||
Changelog
|
||||
---------
|
||||
|
||||
2012-08-03: Mild rewrite to adapt the mod to use perlin noise while spawning.
|
||||
Also got rid of the random-numbers-inside-abm stuff, now using the abm's own
|
||||
'chance' parameter instead. Tuned various settings to try to retain the same
|
||||
overall density and growth rates as in the previous version. Moved this
|
||||
changelog into a separate file.
|
||||
|
||||
2012-07-12: moved project to github.
|
||||
|
||||
2012-07-09 (a bit later): tuned the spawn/grow rates a bit more, made the
|
||||
numbers more sane. Added a radius check to limit the density of the spawned
|
||||
grasses (they won't grow near each other or near dry shrubs or cactus, though
|
||||
they still grow on the top of said cacti).
|
||||
|
||||
2012-07-09: Added cactus, sand, and desert sand as spawning surfaces. Reduced
|
||||
and tuned the spawn rates a bit to try to balance things out. Made that which
|
||||
spawns on grass, dirt, or sand start out at any size, grow over time, and
|
||||
eventually die off. Limited desert sand to only the first two sizes (the
|
||||
smallest size will grow one step, eventually), which will eventually die and
|
||||
turn into dry shrubs. Only the two smallest sizes can spawn on cactus or
|
||||
papyrus (and they don't grow or die). Fixed slightly off-center smallest size.
|
||||
Fixed selection boxes.
|
0
junglegrass/depends.txt
Normal file
0
junglegrass/init.lua
Normal file
3
license.txt
Normal file
@ -0,0 +1,3 @@
|
||||
For the original Ironzorg flower textures, WTFPL
|
||||
For the rest of the textures, CC-BY-SA
|
||||
For all code and everything else in this mod, WTFPL.
|
0
modpack.txt
Normal file
1
plants/depends.txt
Normal file
@ -0,0 +1 @@
|
||||
default
|
448
plants/init.lua
Normal file
@ -0,0 +1,448 @@
|
||||
-- Plantlife mod by Vanessa Ezekowitz
|
||||
-- 2012-11-29
|
||||
--
|
||||
-- This mod combines all of the functionality from poison ivy,
|
||||
-- flowers, and jungle grass. If you have any of these, you no
|
||||
-- longer need them.
|
||||
--
|
||||
-- License:
|
||||
-- CC-BY-SA for most textures, except flowers
|
||||
-- WTFPL for the flowers textures
|
||||
-- WTFPL for all code and everything else
|
||||
|
||||
|
||||
-- Edit these first few variables to turn the various parts on/off
|
||||
-- or to tweak the overall settings.
|
||||
|
||||
local enable_flowers = true
|
||||
local enable_junglegrass = true
|
||||
local enable_poisonivy = true
|
||||
|
||||
local plantlife_debug = true
|
||||
|
||||
local plantlife_seed_diff = 123
|
||||
local perlin_octaves = 3
|
||||
local perlin_persistence = 0.2
|
||||
local perlin_scale = 25
|
||||
|
||||
local plantlife_limit = 0.6 -- compared against perlin noise. lower = more abundant
|
||||
|
||||
local spawn_delay = 2000 -- 2000
|
||||
local spawn_chance = 100 -- 100
|
||||
local grow_delay = 1000 -- 1000
|
||||
local grow_chance = 10 -- 10
|
||||
|
||||
-- Stuff from here on down shouldn't need to be edited.
|
||||
|
||||
local loadstr = "[Plantlife] Loaded (enabled"
|
||||
|
||||
local flowers_seed_diff = plantlife_seed_diff
|
||||
local junglegrass_seed_diff = plantlife_seed_diff + 10
|
||||
local poisonivy_seed_diff = plantlife_seed_diff + 10
|
||||
|
||||
local flowers_list = {
|
||||
{ "Rose", "rose", spawn_delay, 10, spawn_chance , 10},
|
||||
{ "Tulip", "tulip", spawn_delay, 10, spawn_chance , 10},
|
||||
{ "Yellow Dandelion", "dandelion_yellow", spawn_delay, 10, spawn_chance*2 , 10},
|
||||
{ "White Dandelion", "dandelion_white", spawn_delay, 10, spawn_chance*2 , 10},
|
||||
{ "Blue Geranium", "geranium", spawn_delay, 10, spawn_chance , 10},
|
||||
{ "Viola", "viola", spawn_delay, 10, spawn_chance , 10},
|
||||
{ "Cotton Plant", "cotton", spawn_delay, 10, spawn_chance*2 , 10},
|
||||
}
|
||||
|
||||
local grasses_list = {
|
||||
{"junglegrass:shortest","junglegrass:short" },
|
||||
{"junglegrass:short" ,"junglegrass:medium" },
|
||||
{"junglegrass:medium" ,"default:junglegrass" },
|
||||
{"default:junglegrass" , nil}
|
||||
}
|
||||
|
||||
local verticals_list = {
|
||||
"default:dirt",
|
||||
"default:dirt_with_grass",
|
||||
"default:stone",
|
||||
"default:cobble",
|
||||
"default:mossycobble",
|
||||
"default:brick",
|
||||
"default:tree",
|
||||
"default:jungletree",
|
||||
"default:coal",
|
||||
"default:iron"
|
||||
}
|
||||
|
||||
-- Local functions
|
||||
|
||||
math.randomseed(os.time())
|
||||
|
||||
local dbg = function(s)
|
||||
if plantlife_debug then
|
||||
print("[Plantlife] " .. s)
|
||||
end
|
||||
end
|
||||
|
||||
local is_node_loaded = function(node_pos)
|
||||
n = minetest.env:get_node_or_nil(node_pos)
|
||||
if (n == nil) or (n.name == "ignore") then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
-- The spawning ABM
|
||||
|
||||
spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, seed_diff, lightmin, lightmax, nneighbors, ocount)
|
||||
if lightmin == nil then lightmin = 0 end
|
||||
if lightmax == nil then lightmax = LIGHT_MAX end
|
||||
if nneighbors == nil then nneighbors = ssurface end
|
||||
if ocount == nil then ocount = 0 end
|
||||
dbg(sdelay.." "..splant.." "..sradius.." "..schance.." "..ssurface.." "..dump(savoid).." "..lightmin.." "..lightmax.." "..dump(nneighbors).." "..ocount)
|
||||
minetest.register_abm({
|
||||
nodenames = { ssurface },
|
||||
interval = sdelay,
|
||||
chance = schance,
|
||||
neighbors = nneighbors,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local p_top = { x = pos.x, y = pos.y + 1, z = pos.z }
|
||||
local n_top = minetest.env:get_node(p_top)
|
||||
local perlin = minetest.env:get_perlin(seed_diff, perlin_octaves, perlin_persistence, perlin_scale )
|
||||
local noise = perlin:get2d({x=p_top.x, y=p_top.z})
|
||||
if ( noise > plantlife_limit ) and (n_top.name == "air") and is_node_loaded(p_top) then
|
||||
local n_light = minetest.env:get_node_light(p_top, nil)
|
||||
if (minetest.env:find_node_near(p_top, sradius, savoid) == nil )
|
||||
and (n_light >= lightmin)
|
||||
and (n_light <= lightmax)
|
||||
and table.getn(minetest.env:find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, nneighbors)) > ocount
|
||||
then
|
||||
local walldir = plant_valid_wall(p_top)
|
||||
if splant == "poisonivy:seedling" and walldir ~= nil then
|
||||
dbg("Spawn: poisonivy:climbing at "..dump(p_top).." on "..ssurface)
|
||||
minetest.env:add_node(p_top, { name = "poisonivy:climbing", param2 = walldir })
|
||||
else
|
||||
dbg("Spawn: "..splant.." at "..dump(p_top).." on "..ssurface)
|
||||
minetest.env:add_node(p_top, { name = splant })
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
-- The growing ABM
|
||||
|
||||
grow_plants = function(gdelay, gchance, gplant, gresult, dry_early_node, dont_grow_nodes)
|
||||
minetest.register_abm({
|
||||
nodenames = { gplant },
|
||||
interval = gdelay,
|
||||
chance = gchance,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local p_top = {x=pos.x, y=pos.y+1, z=pos.z}
|
||||
local p_bot = {x=pos.x, y=pos.y-1, z=pos.z}
|
||||
local n_top = minetest.env:get_node(p_top)
|
||||
local n_bot = minetest.env:get_node(p_bot)
|
||||
|
||||
dbg("abm triggered for "..gplant.." on "..n_bot.name.." at "..dump(pos).." -- checking if its in "..dump(dont_grow_nodes))
|
||||
if string.find(dump(dont_grow_nodes), n_bot.name) == nil and n_top.name == "air" then
|
||||
dbg("It wasn't, and it has air above it.")
|
||||
-- corner case for changing short junglegrass to dry shrub in desert
|
||||
if (n_bot.name == dry_early_node) and (gplant == "junglegrass:short") then
|
||||
gresult = "default:dry_shrub"
|
||||
dbg("Want to change "..gplant.." to "..gresult)
|
||||
end
|
||||
|
||||
-- corner case for wall-climbing poison ivy
|
||||
if gplant == "poisonivy:climbing" then
|
||||
dbg("Want to grow "..gplant)
|
||||
local walldir=plant_valid_wall(p_top)
|
||||
if walldir ~= nil then
|
||||
dbg("Grow: "..gplant.." upwards to ("..dump(p_top)..")")
|
||||
minetest.env:add_node(p_top, { name = gplant, param2 = walldir })
|
||||
end
|
||||
|
||||
elseif gresult ~= nil then
|
||||
dbg("Grow: "..gplant.." -> "..gresult.." at ("..dump(pos)..")")
|
||||
minetest.env:add_node(pos, { name = gresult })
|
||||
else
|
||||
dbg("Die: "..gplant.." at ("..dump(pos)..")")
|
||||
minetest.env:remove_node(pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
-- function to decide if a node has a wall that's in verticals_list{}
|
||||
-- returns wall direction of valid node, or nil if invalid.
|
||||
|
||||
plant_valid_wall = function(wallpos)
|
||||
local walldir = nil
|
||||
local verts = dump(verticals_list)
|
||||
|
||||
local testpos = { x = wallpos.x-1, y = wallpos.y, z = wallpos.z }
|
||||
if string.find(verts, minetest.env:get_node(testpos).name) ~= nil then walldir=3 end
|
||||
|
||||
local testpos = { x = wallpos.x+1, y = wallpos.y, z = wallpos.z }
|
||||
if string.find(verts, minetest.env:get_node(testpos).name) ~= nil then walldir=2 end
|
||||
|
||||
local testpos = { x = wallpos.x , y = wallpos.y, z = wallpos.z-1 }
|
||||
if string.find(verts, minetest.env:get_node(testpos).name) ~= nil then walldir=5 end
|
||||
|
||||
local testpos = { x = wallpos.x , y = wallpos.y, z = wallpos.z+1 }
|
||||
if string.find(verts, minetest.env:get_node(testpos).name) ~= nil then walldir=4 end
|
||||
|
||||
return walldir
|
||||
end
|
||||
|
||||
-- ###########################################################################
|
||||
-- Flowers section
|
||||
|
||||
if enable_flowers then
|
||||
loadstr = loadstr.." flowers"
|
||||
for i in ipairs(flowers_list) do
|
||||
local flowerdesc = flowers_list[i][1]
|
||||
local flower = flowers_list[i][2]
|
||||
local delay = flowers_list[i][3]
|
||||
local radius = flowers_list[i][4]
|
||||
local chance = flowers_list[i][5]
|
||||
|
||||
minetest.register_node(":flowers:flower_"..flower, {
|
||||
description = flowerdesc,
|
||||
drawtype = "plantlike",
|
||||
tiles = { "flower_"..flower..".png" },
|
||||
inventory_image = "flower_"..flower..".png",
|
||||
wield_image = "flower_"..flower..".png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
groups = { snappy = 3,flammable=2, flower=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -0.15, -0.5, -0.15, 0.15, 0.2, 0.15 },
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node(":flowers:flower_"..flower.."_pot", {
|
||||
description = flowerdesc.." in a pot",
|
||||
drawtype = "plantlike",
|
||||
tiles = { "flower_"..flower.."_pot.png" },
|
||||
inventory_image = "flower_"..flower.."_pot.png",
|
||||
wield_image = "flower_"..flower.."_pot.png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
groups = { snappy = 3,flammable=2 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -0.25, -0.5, -0.25, 0.25, 0.5, 0.25 },
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
type = "shapeless",
|
||||
output = "flowers:flower_"..flower.."_pot",
|
||||
recipe = {
|
||||
"flowers:flower_pot",
|
||||
"flowers:flower_"..flower
|
||||
}
|
||||
})
|
||||
|
||||
spawn_on_surfaces(delay, "flowers:flower_"..flower, radius, chance, "default:dirt_with_grass", {"group:flower"}, flowers_seed_diff)
|
||||
end
|
||||
|
||||
minetest.register_node(":flowers:flower_waterlily", {
|
||||
description = "Waterlily",
|
||||
drawtype = "raillike",
|
||||
tiles = { "flower_waterlily.png" },
|
||||
inventory_image = "flower_waterlily.png",
|
||||
wield_image = "flower_waterlily.png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "wallmounted",
|
||||
walkable = false,
|
||||
groups = { snappy = 3,flammable=2,flower=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -0.4, -0.5, -0.4, 0.4, -0.45, 0.4 },
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node(":flowers:flower_seaweed", {
|
||||
description = "Seaweed",
|
||||
drawtype = "signlike",
|
||||
tiles = { "flower_seaweed.png" },
|
||||
inventory_image = "flower_seaweed.png",
|
||||
wield_image = "flower_seaweed.png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "wallmounted",
|
||||
walkable = false,
|
||||
groups = { snappy = 3,flammable=2,flower=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -0.5, -0.5, -0.5, 0.5, -0.4, 0.5 },
|
||||
},
|
||||
})
|
||||
|
||||
spawn_on_surfaces(spawn_delay/2, "flowers:flower_waterlily", 15 , spawn_chance*3, "default:water_source" , {"group:flower"}, flowers_seed_diff, 10)
|
||||
spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed" , 0.1, spawn_chance*2, "default:water_source" , {"group:flower"}, flowers_seed_diff, 4, 10, {"default:dirt_with_grass"}, 0)
|
||||
spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed" , 0.1, spawn_chance*2, "default:dirt_with_grass", {"group:flower"}, flowers_seed_diff, 4, 10, {"default:water_source"} , 1)
|
||||
spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed" , 0.1, spawn_chance*2, "default:stone" , {"group:flower"}, flowers_seed_diff, 4, 10, {"default:water_source"} , 6)
|
||||
|
||||
|
||||
minetest.register_craftitem(":flowers:flower_pot", {
|
||||
description = "Flower Pot",
|
||||
inventory_image = "flower_pot.png",
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "flowers:flower_pot",
|
||||
recipe = {
|
||||
{ "default:clay_brick", "", "default:clay_brick" },
|
||||
{ "", "default:clay_brick", "" }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craftitem(":flowers:cotton", {
|
||||
description = "Cotton",
|
||||
image = "cotton.png",
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "flowers:cotton 3",
|
||||
recipe ={
|
||||
{"flowers:flower_cotton"},
|
||||
}
|
||||
})
|
||||
|
||||
end
|
||||
|
||||
-- ###########################################################################
|
||||
-- Jungle Grass section
|
||||
|
||||
if enable_junglegrass then
|
||||
loadstr = loadstr.." junglegrass"
|
||||
|
||||
minetest.register_node(':junglegrass:medium', {
|
||||
description = "Jungle Grass (medium height)",
|
||||
drawtype = 'plantlike',
|
||||
tile_images = { 'junglegrass_medium.png' },
|
||||
inventory_image = 'junglegrass_medium.png',
|
||||
wield_image = 'junglegrass_medium.png',
|
||||
sunlight_propagates = true,
|
||||
paramtype = 'light',
|
||||
walkable = false,
|
||||
groups = { snappy = 3, flammable=2, junglegrass=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
drop = 'default:junglegrass',
|
||||
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.4, -0.5, -0.4, 0.4, 0.5, 0.4},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node(':junglegrass:short', {
|
||||
description = "Jungle Grass (short)",
|
||||
drawtype = 'plantlike',
|
||||
tile_images = { 'junglegrass_short.png' },
|
||||
inventory_image = 'junglegrass_short.png',
|
||||
wield_image = 'junglegrass_short.png',
|
||||
sunlight_propagates = true,
|
||||
paramtype = 'light',
|
||||
walkable = false,
|
||||
groups = { snappy = 3, flammable=2, junglegrass=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
drop = 'default:junglegrass',
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.4, -0.5, -0.4, 0.4, 0.3, 0.4},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node(':junglegrass:shortest', {
|
||||
description = "Jungle Grass (very short)",
|
||||
drawtype = 'plantlike',
|
||||
tile_images = { 'junglegrass_shortest.png' },
|
||||
inventory_image = 'junglegrass_shortest.png',
|
||||
wield_image = 'junglegrass_shortest.png',
|
||||
sunlight_propagates = true,
|
||||
paramtype = 'light',
|
||||
walkable = false,
|
||||
groups = { snappy = 3, flammable=2, junglegrass=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
drop = 'default:junglegrass',
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3},
|
||||
},
|
||||
})
|
||||
|
||||
spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/50, "default:dirt_with_grass", {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
|
||||
spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/50, "default:sand" , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
|
||||
spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/10, "default:desert_sand" , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
|
||||
spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/10, "default:desert_sand" , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
|
||||
|
||||
for i in ipairs(grasses_list) do
|
||||
grow_plants(grow_delay, grow_chance/2, grasses_list[i][1], grasses_list[i][2], "default:desert_sand", {"default:cactus", "default:papyrus"})
|
||||
end
|
||||
end
|
||||
|
||||
-- ###########################################################################
|
||||
-- Poison Ivy section
|
||||
|
||||
if enable_poisonivy then
|
||||
loadstr = loadstr.." poisonivy"
|
||||
|
||||
minetest.register_node(':poisonivy:seedling', {
|
||||
description = "Poison ivy (seedling)",
|
||||
drawtype = 'plantlike',
|
||||
tile_images = { 'poisonivy_seedling.png' },
|
||||
inventory_image = 'poisonivy_seedling.png',
|
||||
wield_image = 'poisonivy_seedling.png',
|
||||
sunlight_propagates = true,
|
||||
paramtype = 'light',
|
||||
walkable = false,
|
||||
groups = { snappy = 3, poisonivy=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node(':poisonivy:sproutling', {
|
||||
description = "Poison ivy (sproutling)",
|
||||
drawtype = 'plantlike',
|
||||
tile_images = { 'poisonivy_sproutling.png' },
|
||||
inventory_image = 'poisonivy_sproutling.png',
|
||||
wield_image = 'poisonivy_sproutling.png',
|
||||
sunlight_propagates = true,
|
||||
paramtype = 'light',
|
||||
walkable = false,
|
||||
groups = { snappy = 3, poisonivy=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node(':poisonivy:climbing', {
|
||||
description = "Poison ivy (climbing plant)",
|
||||
drawtype = 'signlike',
|
||||
tile_images = { 'poisonivy_climbing.png' },
|
||||
inventory_image = 'poisonivy_climbing.png',
|
||||
wield_image = 'poisonivy_climbing.png',
|
||||
sunlight_propagates = true,
|
||||
paramtype = 'light',
|
||||
paramtype2 = 'wallmounted',
|
||||
walkable = false,
|
||||
groups = { snappy = 3, poisonivy=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "wallmounted",
|
||||
--wall_side = = <default>
|
||||
},
|
||||
})
|
||||
|
||||
spawn_on_surfaces(spawn_delay, "poisonivy:seedling", 10 , spawn_chance/10, "default:dirt_with_grass", {"group:poisonivy","group:flower"}, poisonivy_seed_diff, 7)
|
||||
grow_plants(spawn_delay, grow_chance, "poisonivy:seedling", "poisonivy:sproutling")
|
||||
grow_plants(spawn_delay, grow_chance*2, "poisonivy:climbing")
|
||||
end
|
||||
|
||||
print(loadstr..")")
|
448
plants/init.lua~
Normal file
@ -0,0 +1,448 @@
|
||||
-- Plantlife mod by Vanessa Ezekowitz
|
||||
-- 2012-11-29
|
||||
--
|
||||
-- This mod combines all of the functionality from poison ivy,
|
||||
-- flowers, and jungle grass. If you have any of these, you no
|
||||
-- longer need them.
|
||||
--
|
||||
-- License:
|
||||
-- CC-BY-SA for most textures, except flowers
|
||||
-- WTFPL for the flowers textures
|
||||
-- WTFPL for all code and everything else
|
||||
|
||||
|
||||
-- Edit these first few variables to turn the various parts on/off
|
||||
-- or to tweak the overall settings.
|
||||
|
||||
local enable_flowers = true
|
||||
local enable_junglegrass = true
|
||||
local enable_poisonivy = true
|
||||
|
||||
local plantlife_debug = true
|
||||
|
||||
local plantlife_seed_diff = 123
|
||||
local perlin_octaves = 3
|
||||
local perlin_persistence = 0.2
|
||||
local perlin_scale = 25
|
||||
|
||||
local plantlife_limit = 0.6 -- lower = more abundant
|
||||
|
||||
local spawn_delay = 20 -- 2000
|
||||
local spawn_chance = 2 -- 100
|
||||
local grow_delay = 10 -- 1000
|
||||
local grow_chance = 2 -- 10
|
||||
|
||||
-- Stuff from here on down shouldn't need to be edited.
|
||||
|
||||
local loadstr = "[Plantlife] Loaded (enabled"
|
||||
|
||||
local flowers_seed_diff = plantlife_seed_diff
|
||||
local junglegrass_seed_diff = plantlife_seed_diff + 10
|
||||
local poisonivy_seed_diff = plantlife_seed_diff + 10
|
||||
|
||||
local flowers_list = {
|
||||
{ "Rose", "rose", spawn_delay, 10, spawn_chance , 10},
|
||||
{ "Tulip", "tulip", spawn_delay, 10, spawn_chance , 10},
|
||||
{ "Yellow Dandelion", "dandelion_yellow", spawn_delay, 10, spawn_chance*2 , 10},
|
||||
{ "White Dandelion", "dandelion_white", spawn_delay, 10, spawn_chance*2 , 10},
|
||||
{ "Blue Geranium", "geranium", spawn_delay, 10, spawn_chance , 10},
|
||||
{ "Viola", "viola", spawn_delay, 10, spawn_chance , 10},
|
||||
{ "Cotton Plant", "cotton", spawn_delay, 10, spawn_chance*2 , 10},
|
||||
}
|
||||
|
||||
local grasses_list = {
|
||||
{"junglegrass:shortest","junglegrass:short" },
|
||||
{"junglegrass:short" ,"junglegrass:medium" },
|
||||
{"junglegrass:medium" ,"default:junglegrass" },
|
||||
{"default:junglegrass" , nil}
|
||||
}
|
||||
|
||||
local verticals_list = {
|
||||
"default:dirt",
|
||||
"default:dirt_with_grass",
|
||||
"default:stone",
|
||||
"default:cobble",
|
||||
"default:mossycobble",
|
||||
"default:brick",
|
||||
"default:tree",
|
||||
"default:jungletree",
|
||||
"default:coal",
|
||||
"default:iron"
|
||||
}
|
||||
|
||||
-- Local functions
|
||||
|
||||
math.randomseed(os.time())
|
||||
|
||||
local dbg = function(s)
|
||||
if plantlife_debug then
|
||||
print("[Plantlife] " .. s)
|
||||
end
|
||||
end
|
||||
|
||||
local is_node_loaded = function(node_pos)
|
||||
n = minetest.env:get_node_or_nil(node_pos)
|
||||
if (n == nil) or (n.name == "ignore") then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
-- The spawning ABM
|
||||
|
||||
spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, seed_diff, lightmin, lightmax, nneighbors, ocount)
|
||||
if lightmin == nil then lightmin = 0 end
|
||||
if lightmax == nil then lightmax = LIGHT_MAX end
|
||||
if nneighbors == nil then nneighbors = ssurface end
|
||||
if ocount == nil then ocount = 0 end
|
||||
dbg(sdelay.." "..splant.." "..sradius.." "..schance.." "..ssurface.." "..dump(savoid).." "..lightmin.." "..lightmax.." "..dump(nneighbors).." "..ocount)
|
||||
minetest.register_abm({
|
||||
nodenames = { ssurface },
|
||||
interval = sdelay,
|
||||
chance = schance,
|
||||
neighbors = nneighbors,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local p_top = { x = pos.x, y = pos.y + 1, z = pos.z }
|
||||
local n_top = minetest.env:get_node(p_top)
|
||||
local perlin = minetest.env:get_perlin(seed_diff, perlin_octaves, perlin_persistence, perlin_scale )
|
||||
local noise = perlin:get2d({x=p_top.x, y=p_top.z})
|
||||
if ( noise > plantlife_limit ) and (n_top.name == "air") and is_node_loaded(p_top) then
|
||||
local n_light = minetest.env:get_node_light(p_top, nil)
|
||||
if (minetest.env:find_node_near(p_top, sradius, savoid) == nil )
|
||||
-- and (n_light >= lightmin)
|
||||
-- and (n_light <= lightmax)
|
||||
and table.getn(minetest.env:find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, nneighbors)) > ocount
|
||||
then
|
||||
local walldir = plant_valid_wall(p_top)
|
||||
if splant == "poisonivy:seedling" and walldir ~= nil then
|
||||
dbg("Spawn: poisonivy:climbing at "..dump(p_top).." on "..ssurface)
|
||||
minetest.env:add_node(p_top, { name = "poisonivy:climbing", param2 = walldir })
|
||||
else
|
||||
dbg("Spawn: "..splant.." at "..dump(p_top).." on "..ssurface)
|
||||
minetest.env:add_node(p_top, { name = splant })
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
-- The growing ABM
|
||||
|
||||
grow_plants = function(gdelay, gchance, gplant, gresult, dry_early_node, dont_grow_nodes)
|
||||
minetest.register_abm({
|
||||
nodenames = { gplant },
|
||||
interval = gdelay,
|
||||
chance = gchance,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local p_top = {x=pos.x, y=pos.y+1, z=pos.z}
|
||||
local p_bot = {x=pos.x, y=pos.y-1, z=pos.z}
|
||||
local n_top = minetest.env:get_node(p_top)
|
||||
local n_bot = minetest.env:get_node(p_bot)
|
||||
|
||||
dbg("abm triggered for "..gplant.." on "..n_bot.name.." at "..dump(pos).." -- checking if its in "..dump(dont_grow_nodes))
|
||||
if string.find(dump(dont_grow_nodes), n_bot.name) == nil and n_top.name == "air" then
|
||||
dbg("It wasn't, and it has air above it.")
|
||||
-- corner case for changing short junglegrass to dry shrub
|
||||
if (n_bot.name == dry_early_node) and (gplant == "junglegrass:short") then
|
||||
gresult = "default:dry_shrub"
|
||||
dbg("Want to change "..gplant.." to "..gresult)
|
||||
end
|
||||
|
||||
-- corner case for wall-climbing poison ivy
|
||||
if gplant == "poisonivy:climbing" then
|
||||
dbg("Want to grow "..gplant)
|
||||
local walldir=plant_valid_wall(p_top)
|
||||
if walldir ~= nil then
|
||||
dbg("Grow: "..gplant.." upwards to ("..dump(p_top)..")")
|
||||
minetest.env:add_node(p_top, { name = gplant, param2 = walldir })
|
||||
end
|
||||
|
||||
elseif gresult ~= nil then
|
||||
dbg("Grow: "..gplant.." -> "..gresult.." at ("..dump(pos)..")")
|
||||
minetest.env:add_node(pos, { name = gresult })
|
||||
else
|
||||
dbg("Die: "..gplant.." at ("..dump(pos)..")")
|
||||
minetest.env:remove_node(pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
-- function to decide if a node has a wall that's in verticals_list{}
|
||||
-- returns wall direction of valid node, or nil if invalid.
|
||||
|
||||
plant_valid_wall = function(wallpos)
|
||||
local walldir = nil
|
||||
local verts = dump(verticals_list)
|
||||
|
||||
local testpos = { x = wallpos.x-1, y = wallpos.y, z = wallpos.z }
|
||||
if string.find(verts, minetest.env:get_node(testpos).name) ~= nil then walldir=3 end
|
||||
|
||||
local testpos = { x = wallpos.x+1, y = wallpos.y, z = wallpos.z }
|
||||
if string.find(verts, minetest.env:get_node(testpos).name) ~= nil then walldir=2 end
|
||||
|
||||
local testpos = { x = wallpos.x , y = wallpos.y, z = wallpos.z-1 }
|
||||
if string.find(verts, minetest.env:get_node(testpos).name) ~= nil then walldir=5 end
|
||||
|
||||
local testpos = { x = wallpos.x , y = wallpos.y, z = wallpos.z+1 }
|
||||
if string.find(verts, minetest.env:get_node(testpos).name) ~= nil then walldir=4 end
|
||||
|
||||
return walldir
|
||||
end
|
||||
|
||||
-- ###########################################################################
|
||||
-- Flowers section
|
||||
|
||||
if enable_flowers then
|
||||
loadstr = loadstr.." flowers"
|
||||
for i in ipairs(flowers_list) do
|
||||
local flowerdesc = flowers_list[i][1]
|
||||
local flower = flowers_list[i][2]
|
||||
local delay = flowers_list[i][3]
|
||||
local radius = flowers_list[i][4]
|
||||
local chance = flowers_list[i][5]
|
||||
|
||||
minetest.register_node(":flowers:flower_"..flower, {
|
||||
description = flowerdesc,
|
||||
drawtype = "plantlike",
|
||||
tiles = { "flower_"..flower..".png" },
|
||||
inventory_image = "flower_"..flower..".png",
|
||||
wield_image = "flower_"..flower..".png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
groups = { snappy = 3,flammable=2, flower=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -0.15, -0.5, -0.15, 0.15, 0.2, 0.15 },
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node(":flowers:flower_"..flower.."_pot", {
|
||||
description = flowerdesc.." in a pot",
|
||||
drawtype = "plantlike",
|
||||
tiles = { "flower_"..flower.."_pot.png" },
|
||||
inventory_image = "flower_"..flower.."_pot.png",
|
||||
wield_image = "flower_"..flower.."_pot.png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
groups = { snappy = 3,flammable=2 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -0.25, -0.5, -0.25, 0.25, 0.5, 0.25 },
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
type = "shapeless",
|
||||
output = "flowers:flower_"..flower.."_pot",
|
||||
recipe = {
|
||||
"flowers:flower_pot",
|
||||
"flowers:flower_"..flower
|
||||
}
|
||||
})
|
||||
|
||||
spawn_on_surfaces(delay, "flowers:flower_"..flower, radius, chance, "default:dirt_with_grass", {"group:flower"}, flowers_seed_diff)
|
||||
end
|
||||
|
||||
minetest.register_node(":flowers:flower_waterlily", {
|
||||
description = "Waterlily",
|
||||
drawtype = "raillike",
|
||||
tiles = { "flower_waterlily.png" },
|
||||
inventory_image = "flower_waterlily.png",
|
||||
wield_image = "flower_waterlily.png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "wallmounted",
|
||||
walkable = false,
|
||||
groups = { snappy = 3,flammable=2,flower=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -0.4, -0.5, -0.4, 0.4, -0.45, 0.4 },
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node(":flowers:flower_seaweed", {
|
||||
description = "Seaweed",
|
||||
drawtype = "signlike",
|
||||
tiles = { "flower_seaweed.png" },
|
||||
inventory_image = "flower_seaweed.png",
|
||||
wield_image = "flower_seaweed.png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "wallmounted",
|
||||
walkable = false,
|
||||
groups = { snappy = 3,flammable=2,flower=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -0.5, -0.5, -0.5, 0.5, -0.4, 0.5 },
|
||||
},
|
||||
})
|
||||
|
||||
spawn_on_surfaces(spawn_delay/2, "flowers:flower_waterlily", 15 , spawn_chance*3, "default:water_source" , {"group:flower"}, flowers_seed_diff, 10)
|
||||
spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed" , 0.1, spawn_chance*2, "default:water_source" , {"group:flower"}, flowers_seed_diff, 4, 10, {"default:dirt_with_grass"}, 0)
|
||||
spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed" , 0.1, spawn_chance*2, "default:dirt_with_grass", {"group:flower"}, flowers_seed_diff, 4, 10, {"default:water_source"} , 1)
|
||||
spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed" , 0.1, spawn_chance*2, "default:stone" , {"group:flower"}, flowers_seed_diff, 4, 10, {"default:water_source"} , 6)
|
||||
|
||||
|
||||
minetest.register_craftitem(":flowers:flower_pot", {
|
||||
description = "Flower Pot",
|
||||
inventory_image = "flower_pot.png",
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "flowers:flower_pot",
|
||||
recipe = {
|
||||
{ "default:clay_brick", "", "default:clay_brick" },
|
||||
{ "", "default:clay_brick", "" }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craftitem(":flowers:cotton", {
|
||||
description = "Cotton",
|
||||
image = "cotton.png",
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "flowers:cotton 3",
|
||||
recipe ={
|
||||
{"flowers:flower_cotton"},
|
||||
}
|
||||
})
|
||||
|
||||
end
|
||||
|
||||
-- ###########################################################################
|
||||
-- Jungle Grass section
|
||||
|
||||
if enable_junglegrass then
|
||||
loadstr = loadstr.." junglegrass"
|
||||
|
||||
minetest.register_node(':junglegrass:medium', {
|
||||
description = "Jungle Grass (medium height)",
|
||||
drawtype = 'plantlike',
|
||||
tile_images = { 'junglegrass_medium.png' },
|
||||
inventory_image = 'junglegrass_medium.png',
|
||||
wield_image = 'junglegrass_medium.png',
|
||||
sunlight_propagates = true,
|
||||
paramtype = 'light',
|
||||
walkable = false,
|
||||
groups = { snappy = 3, flammable=2, junglegrass=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
drop = 'default:junglegrass',
|
||||
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.4, -0.5, -0.4, 0.4, 0.5, 0.4},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node(':junglegrass:short', {
|
||||
description = "Jungle Grass (short)",
|
||||
drawtype = 'plantlike',
|
||||
tile_images = { 'junglegrass_short.png' },
|
||||
inventory_image = 'junglegrass_short.png',
|
||||
wield_image = 'junglegrass_short.png',
|
||||
sunlight_propagates = true,
|
||||
paramtype = 'light',
|
||||
walkable = false,
|
||||
groups = { snappy = 3, flammable=2, junglegrass=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
drop = 'default:junglegrass',
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.4, -0.5, -0.4, 0.4, 0.3, 0.4},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node(':junglegrass:shortest', {
|
||||
description = "Jungle Grass (very short)",
|
||||
drawtype = 'plantlike',
|
||||
tile_images = { 'junglegrass_shortest.png' },
|
||||
inventory_image = 'junglegrass_shortest.png',
|
||||
wield_image = 'junglegrass_shortest.png',
|
||||
sunlight_propagates = true,
|
||||
paramtype = 'light',
|
||||
walkable = false,
|
||||
groups = { snappy = 3, flammable=2, junglegrass=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
drop = 'default:junglegrass',
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3},
|
||||
},
|
||||
})
|
||||
|
||||
spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/50, "default:dirt_with_grass", {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
|
||||
spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/50, "default:sand" , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
|
||||
spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/10, "default:desert_sand" , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
|
||||
spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/10, "default:desert_sand" , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
|
||||
|
||||
for i in ipairs(grasses_list) do
|
||||
grow_plants(grow_delay, grow_chance/2, grasses_list[i][1], grasses_list[i][2], "default:desert_sand", {"default:cactus", "default:papyrus"})
|
||||
end
|
||||
end
|
||||
|
||||
-- ###########################################################################
|
||||
-- Poison Ivy section
|
||||
|
||||
if enable_poisonivy then
|
||||
loadstr = loadstr.." poisonivy"
|
||||
|
||||
minetest.register_node(':poisonivy:seedling', {
|
||||
description = "Poison ivy (seedling)",
|
||||
drawtype = 'plantlike',
|
||||
tile_images = { 'poisonivy_seedling.png' },
|
||||
inventory_image = 'poisonivy_seedling.png',
|
||||
wield_image = 'poisonivy_seedling.png',
|
||||
sunlight_propagates = true,
|
||||
paramtype = 'light',
|
||||
walkable = false,
|
||||
groups = { snappy = 3, poisonivy=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node(':poisonivy:sproutling', {
|
||||
description = "Poison ivy (sproutling)",
|
||||
drawtype = 'plantlike',
|
||||
tile_images = { 'poisonivy_sproutling.png' },
|
||||
inventory_image = 'poisonivy_sproutling.png',
|
||||
wield_image = 'poisonivy_sproutling.png',
|
||||
sunlight_propagates = true,
|
||||
paramtype = 'light',
|
||||
walkable = false,
|
||||
groups = { snappy = 3, poisonivy=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node(':poisonivy:climbing', {
|
||||
description = "Poison ivy (climbing plant)",
|
||||
drawtype = 'signlike',
|
||||
tile_images = { 'poisonivy_climbing.png' },
|
||||
inventory_image = 'poisonivy_climbing.png',
|
||||
wield_image = 'poisonivy_climbing.png',
|
||||
sunlight_propagates = true,
|
||||
paramtype = 'light',
|
||||
paramtype2 = 'wallmounted',
|
||||
walkable = false,
|
||||
groups = { snappy = 3, poisonivy=1 },
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "wallmounted",
|
||||
--wall_side = = <default>
|
||||
},
|
||||
})
|
||||
|
||||
spawn_on_surfaces(spawn_delay, "poisonivy:seedling", 10 , spawn_chance/10, "default:dirt_with_grass", {"group:poisonivy","group:flower"}, poisonivy_seed_diff, 7)
|
||||
grow_plants(spawn_delay, grow_chance, "poisonivy:seedling", "poisonivy:sproutling")
|
||||
grow_plants(spawn_delay, grow_chance*2, "poisonivy:climbing")
|
||||
end
|
||||
|
||||
print(loadstr..")")
|
BIN
plants/textures/cotton.png
Normal file
After Width: | Height: | Size: 680 B |
BIN
plants/textures/flower_cotton.png
Normal file
After Width: | Height: | Size: 315 B |
BIN
plants/textures/flower_cotton_pot.png
Normal file
After Width: | Height: | Size: 498 B |
BIN
plants/textures/flower_dandelion_white.png
Normal file
After Width: | Height: | Size: 169 B |
BIN
plants/textures/flower_dandelion_white_pot.png
Normal file
After Width: | Height: | Size: 464 B |
BIN
plants/textures/flower_dandelion_yellow.png
Normal file
After Width: | Height: | Size: 166 B |
BIN
plants/textures/flower_dandelion_yellow_pot.png
Normal file
After Width: | Height: | Size: 462 B |
BIN
plants/textures/flower_geranium.png
Normal file
After Width: | Height: | Size: 361 B |
BIN
plants/textures/flower_geranium_pot.png
Normal file
After Width: | Height: | Size: 520 B |
BIN
plants/textures/flower_pot.png
Normal file
After Width: | Height: | Size: 405 B |
BIN
plants/textures/flower_rose.png
Normal file
After Width: | Height: | Size: 171 B |
BIN
plants/textures/flower_rose_pot.png
Normal file
After Width: | Height: | Size: 479 B |
BIN
plants/textures/flower_seaweed.png
Normal file
After Width: | Height: | Size: 416 B |
BIN
plants/textures/flower_tulip.png
Normal file
After Width: | Height: | Size: 159 B |
BIN
plants/textures/flower_tulip_pot.png
Normal file
After Width: | Height: | Size: 470 B |
BIN
plants/textures/flower_viola.png
Normal file
After Width: | Height: | Size: 140 B |
BIN
plants/textures/flower_viola_pot.png
Normal file
After Width: | Height: | Size: 465 B |
BIN
plants/textures/flower_waterlily.png
Normal file
After Width: | Height: | Size: 221 B |
BIN
plants/textures/junglegrass_medium.png
Normal file
After Width: | Height: | Size: 537 B |
BIN
plants/textures/junglegrass_short.png
Normal file
After Width: | Height: | Size: 370 B |
BIN
plants/textures/junglegrass_shortest.png
Normal file
After Width: | Height: | Size: 325 B |
BIN
plants/textures/poisonivy_climbing.png
Normal file
After Width: | Height: | Size: 456 B |
BIN
plants/textures/poisonivy_seedling.png
Normal file
After Width: | Height: | Size: 270 B |
BIN
plants/textures/poisonivy_sproutling.png
Normal file
After Width: | Height: | Size: 426 B |