Add dirt-with-grass color and stages

master
Wuzzy 2021-07-19 13:11:09 +02:00
parent 8a1f0b545c
commit 392f920396
34 changed files with 185 additions and 106 deletions

75
mods/hades_core/dirt.lua Normal file
View File

@ -0,0 +1,75 @@
local S = minetest.get_translator("hades_core")
-- This registers the grass node and the grass-covered versions of it.
-- There are also intermediate grass groth levels between
-- naked dirt and dirt with grass to have a sense of 'progress'.
-- Param2 is used for the grass color. hades_core:dirt
-- should keep this param2 value
-- Basic dirt node
minetest.register_node("hades_core:dirt", {
description = S("Dirt"),
_tt_help = S("Becomes grassy when exposed to light"),
tiles = {"default_dirt.png"},
is_ground_content = true,
groups = {crumbly=3,soil=1,dirt=1, porous=1},
sounds = hades_sounds.node_sound_dirt_defaults(),
})
-- ... with grass cover
minetest.register_node("hades_core:dirt_with_grass", {
description = S("Dirt with Grass"),
paramtype2 = "color",
tiles = {
"hades_core_grass_cover_colorable.png",
{name="default_dirt.png", color="white"},
},
overlay_tiles = {
"hades_core_grass_cover_colorable.png",
"",
{name="hades_core_grass_side_cover_colorable.png", tileable_vertical=false}
},
palette_index = 0,
color = "#acef6a",
palette = "hades_core_palette_grass.png",
is_ground_content = true,
groups = {crumbly=3,soil=1,dirt=1,dirt_with_grass=1, porous=1},
drop = 'hades_core:dirt',
sounds = hades_sounds.node_sound_dirt_defaults({
footstep = {name="default_grass_footstep", gain=0.25},
}),
})
-- Intermediate grass growth levels
for l=1, 3 do
local sounds
if l > 1 then
sounds = hades_sounds.node_sound_dirt_defaults({
footstep = {name="default_grass_footstep", gain=0.25},
})
else
sounds = hades_sounds.node_sound_dirt_defaults()
end
minetest.register_node("hades_core:dirt_with_grass_l"..l, {
description = S("Dirt with Growing Grass (Stage @1)", l),
tiles = {{name="default_dirt.png", color="white"}},
overlay_tiles = {
"hades_core_grass_cover_colorable.png^[mask:hades_core_grass_mask_l"..l..".png",
"",
-- Individual textures for each sides, needed so the grassy pixels "connect"
-- nicely with the top face.
{name="hades_core_grass_side_cover_colorable.png^[mask:hades_core_grass_side_mask_l"..l.."_xm.png", tileable_vertical=false},
{name="hades_core_grass_side_cover_colorable.png^[mask:hades_core_grass_side_mask_l"..l.."_xp.png", tileable_vertical=false},
{name="hades_core_grass_side_cover_colorable.png^[mask:hades_core_grass_side_mask_l"..l.."_zm.png", tileable_vertical=false},
{name="hades_core_grass_side_cover_colorable.png^[mask:hades_core_grass_side_mask_l"..l.."_zp.png", tileable_vertical=false},
},
paramtype2 = "color",
color = "#acef6a",
palette = "hades_core_palette_grass.png",
is_ground_content = true,
groups = {crumbly=3,soil=1,dirt=1,dirt_with_grass=l+1, porous=1},
drop = 'hades_core:dirt',
sounds = sounds,
})
end

View File

@ -183,10 +183,27 @@ minetest.register_abm({
end,
})
-- Takes a node name and if it's capable of being covered by grass,
-- returns the node name of the next level of "grassiness",
-- otherwise it returns nil
local function get_next_grass_cover_level(nodename)
if nodename == "hades_core:dirt" then
return "hades_core:dirt_with_grass_l1"
elseif nodename == "hades_core:dirt_with_grass_l1" then
return "hades_core:dirt_with_grass_l2"
elseif nodename == "hades_core:dirt_with_grass_l2" then
return "hades_core:dirt_with_grass_l3"
elseif nodename == "hades_core:dirt_with_grass_l3" then
return "hades_core:dirt_with_grass"
else
return nodename
end
end
-- Dirt ABMs
minetest.register_abm({
label = "Grow grass on dirt",
nodenames = {"hades_core:dirt"},
label = "Grow grass on dirt under bright light",
nodenames = {"group:dirt"},
interval = 2,
chance = 200,
action = function(pos, node)
@ -196,14 +213,34 @@ minetest.register_abm({
if nodedef and (nodedef.sunlight_propagates or nodedef.paramtype == "light")
and nodedef.liquidtype == "none"
and (minetest.get_node_light(above) or 0) >= 13 then
minetest.set_node(pos, {name = "hades_core:dirt_with_grass"})
local nextnode = get_next_grass_cover_level(node.name)
if nextnode then
minetest.set_node(pos, {name = nextnode, param2 = node.param2})
end
end
end
})
minetest.register_abm({
label = "Grow grass on dirt under air in faint light",
nodenames = {"group:dirt"},
interval = 50,
chance = 20,
action = function(pos, node)
local name = minetest.get_node(pos).name
local node = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})
if node.name == "air" and (minetest.get_node_light(pos) or 0) >= 8 then
local nextnode = get_next_grass_cover_level(node.name)
if nextnode then
minetest.set_node(pos, {name = nextnode, param2 = node.param2})
end
end
end,
})
minetest.register_abm({
label = "Turn covered 'dirt with grass' back to dirt",
nodenames = {"hades_core:dirt_with_grass"},
nodenames = {"group:dirt_with_grass"},
interval = 2,
chance = 20,
action = function(pos, node)
@ -213,7 +250,7 @@ minetest.register_abm({
if name ~= "ignore" and nodedef
and not ((nodedef.sunlight_propagates or nodedef.paramtype == "light")
and nodedef.liquidtype == "none") then
minetest.set_node(pos, {name = "hades_core:dirt"})
minetest.set_node(pos, {name = "hades_core:dirt", param2 = node.param2})
end
end
})
@ -310,15 +347,15 @@ minetest.register_abm({
minetest.register_abm({
label = "Create dirt (extended water check)",
nodenames = {"hades_core:fertile_sand"},
neighbors = {"hades_core:dirt", "hades_core:dirt_with_grass"},
neighbors = {"group:dirt"},
interval = 50,
chance = 5,
action = function(pos, node)
if minetest.find_node_near(pos, 10, {"group:water"}) == nil then
return
else
minetest.set_node(pos, {name="hades_core:dirt"})
end
if minetest.find_node_near(pos, 10, {"group:water"}) == nil then
return
else
minetest.set_node(pos, {name="hades_core:dirt"})
end
end,
})
@ -333,29 +370,6 @@ minetest.register_abm({
end,
})
--
-- Dirt transformation
--
minetest.register_abm({
label = "Grow grass on dirt",
nodenames = {"hades_core:dirt"},
interval = 50,
chance = 20,
action = function(pos, node)
local name = minetest.get_node(pos).name
pos.y = pos.y+1
if minetest.get_node(pos).name == "air" then
if minetest.get_node_light(pos) < 8 then
return
else
pos.y = pos.y-1
minetest.set_node(pos, {name="hades_core:dirt_with_grass"})
end
end
end,
})
--
-- Sugarcane growing
--
@ -363,13 +377,13 @@ minetest.register_abm({
minetest.register_abm({
label = "Grow sugarcane",
nodenames = {"hades_core:sugarcane"},
neighbors = {"hades_core:dirt", "hades_core:dirt_with_grass"},
neighbors = {"group:dirt"},
interval = 55,
chance = 35,
action = function(pos, node)
pos.y = pos.y-1
local name = minetest.get_node(pos).name
if name == "hades_core:dirt" or name == "hades_core:dirt_with_grass" then
if minetest.get_item_group(name, "dirt") > 0 then
pos.y = pos.y+1
local height = 0
while minetest.get_node(pos).name == "hades_core:sugarcane" and height < 3 do
@ -392,14 +406,12 @@ minetest.register_abm({
interval = 500,
chance = 25,
action = function(pos, node)
if minetest.find_node_near(pos, 10, {"hades_core:sugarcane"}) == nil then
pos.y = pos.y+1
if minetest.get_node(pos).name == "air" then
minetest.set_node(pos, {name="hades_core:sugarcane"})
end
else
return
end
if minetest.find_node_near(pos, 10, {"hades_core:sugarcane"}) == nil then
pos.y = pos.y+1
if minetest.get_node(pos).name == "air" then
minetest.set_node(pos, {name="hades_core:sugarcane"})
end
end
end,
})
@ -435,13 +447,13 @@ minetest.register_abm({
minetest.register_abm({
label = "Grow papyrus",
nodenames = {"hades_core:papyrus"},
neighbors = {"hades_core:dirt", "hades_core:dirt_with_grass"},
neighbors = {"group:dirt"},
interval = 50,
chance = 20,
action = function(pos, node)
pos.y = pos.y-1
local name = minetest.get_node(pos).name
if name == "hades_core:dirt" or name == "hades_core:dirt_with_grass" then
if minetest.get_item_group(name, "dirt") > 0 then
if minetest.find_node_near(pos, 3, {"group:water"}) == nil then
return
end

View File

@ -3,6 +3,7 @@ hades_core = {}
-- Load files
dofile(minetest.get_modpath("hades_core").."/functions.lua")
dofile(minetest.get_modpath("hades_core").."/simple_nodes.lua")
dofile(minetest.get_modpath("hades_core").."/dirt.lua")
dofile(minetest.get_modpath("hades_core").."/liquids.lua")
dofile(minetest.get_modpath("hades_core").."/tools.lua")
dofile(minetest.get_modpath("hades_core").."/plants.lua")

View File

@ -362,27 +362,7 @@ minetest.register_node("hades_core:stone_with_ruby", {
sounds = hades_sounds.node_sound_stone_defaults(),
})
-- Soft blocks: dirt, ash, sand, gravel
minetest.register_node("hades_core:dirt_with_grass", {
description = S("Dirt with Grass"),
tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"},
is_ground_content = true,
groups = {crumbly=3,soil=1,dirt=1, porous=1},
drop = 'hades_core:dirt',
sounds = hades_sounds.node_sound_dirt_defaults({
footstep = {name="default_grass_footstep", gain=0.25},
}),
})
minetest.register_node("hades_core:dirt", {
description = S("Dirt"),
_tt_help = S("Becomes grassy when exposed to light"),
tiles = {"default_dirt.png"},
is_ground_content = true,
groups = {crumbly=3,soil=1,dirt=1, porous=1},
sounds = hades_sounds.node_sound_dirt_defaults(),
})
-- Soft blocks: ash, sand, gravel, etc. (except dirt)
minetest.register_node("hades_core:ash", {
description = S("Volcanic Ash"),

Binary file not shown.

Before

Width:  |  Height:  |  Size: 609 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 475 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

View File

Before

Width:  |  Height:  |  Size: 248 B

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 B

View File

@ -1,28 +1,26 @@
local S = minetest.get_translator("hades_farming")
local dirt_groups = table.copy(minetest.registered_nodes["hades_core:dirt"].groups)
local dwg_groups = table.copy(minetest.registered_nodes["hades_core:dirt_with_grass"].groups)
local override_nodes = {
"hades_core:dirt",
"hades_core:dirt_with_grass_l1",
"hades_core:dirt_with_grass_l2",
"hades_core:dirt_with_grass_l3",
"hades_core:dirt_with_grass",
}
for n=1, #override_nodes do
local nodename = override_nodes[n]
local groups = table.copy(minetest.registered_nodes[nodename].groups)
groups.soil = 1
dirt_groups.soil = 1
dwg_groups.soil = 1
minetest.override_item("hades_core:dirt", {
groups = dirt_groups,
soil = {
base = "hades_core:dirt",
dry = "hades_farming:soil",
wet = "hades_farming:soil_wet"
}
})
minetest.override_item("hades_core:dirt_with_grass", {
dwg_groups,
soil = {
base = "hades_core:dirt_with_grass",
dry = "hades_farming:soil",
wet = "hades_farming:soil_wet"
}
})
minetest.override_item(nodename, {
groups = groups,
soil = {
base = nodename,
dry = "hades_farming:soil",
wet = "hades_farming:soil_wet"
}
})
end
minetest.register_node("hades_farming:soil", {
description = S("Soil"),

View File

@ -141,15 +141,17 @@ local get_apply_fertilizer = function(super)
end
end
end
elseif nname == "hades_core:dirt" or nname == "hades_core:stone" or nname == "hades_core:tuff" or nname == "hades_core:cobble" or nname == "walls:cobble" then
-- Grow grass on dirt
elseif nname == "hades_core:dirt" or minetest.get_item_group(nname, "dirt_with_grass") > 1 or nname == "hades_core:stone" or nname == "hades_core:tuff" or nname == "hades_core:cobble" or nname == "walls:cobble" then
-- Grow grass cover on dirt
-- [SUPER] also grow moss
local posses = {}
local minmax
local dwg2 = minetest.get_item_group(nname, "dirt_with_grass")
local d2 = minetest.get_item_group(nname, "dirt")
if super then
minmax=2
else
if nname ~= "hades_core:dirt" then
if d2 == 0 and dwg2 == 0 then
return itemstack
end
minmax=1
@ -161,12 +163,18 @@ local get_apply_fertilizer = function(super)
if vector.distance(pos, ppos) <= 2.3 then
local node = minetest.get_node(ppos)
local above_node = minetest.get_node({x = x, y = y + 1, z = z})
if node.name == nname and
-- Apply change to same or "compatible" node type as the pointed
-- node only, e.g. dirt is "compatible" with dirt-with-grass
local d1 = minetest.get_item_group(node.name, "dirt")
local dwg1 = minetest.get_item_group(node.name, "dirt_with_grass")
if ((node.name == nname) or ((dwg1 > 1 or d1 > 0) and (dwg2 > 1 or d2 > 0))) and
(nname ~= "hades_core:dirt" or
(minetest.registered_nodes[above_node.name] and
minetest.registered_nodes[above_node.name].walkable == false)) then
if nname == "hades_core:dirt" then
node.name = "hades_core:dirt_with_grass"
elseif dwg2 > 0 then
node.name = "hades_core:dirt_with_grass"
elseif nname == "hades_core:stone" then
node.name = "hades_core:mossystone"
elseif nname == "hades_core:tuff" then

View File

@ -1,7 +1,7 @@
local S = minetest.get_translator("hades_magic_wand")
local cycles = {
{ "hades_core:dirt", "hades_core:dirt_with_grass" },
{ "hades_core:dirt", "hades_core:dirt_with_grass_l1", "hades_core:dirt_with_grass_l2", "hades_core:dirt_with_grass_l3", "hades_core:dirt_with_grass" },
{ "hades_farming:soil", "hades_farming:soil_wet" },
{ "hades_core:grass_1", "hades_core:grass_2", "hades_core:grass_3", "hades_core:grass_4", "hades_core:grass_5" },
{ "hades_waterplants:seaweed_4", "hades_waterplants:seaweed_2", "hades_waterplants:seaweed_3", "hades_waterplants:seaweed" },

View File

@ -1,5 +1,7 @@
local pr_a, pr_j -- PseudoRandom vars
local default_underground = {"hades_core:dirt", "hades_core:dirt_with_grass_l1", "hades_core:dirt_with_grass_l2", "hades_core:dirt_with_grass_l3", "hades_core:dirt_with_grass"}
function hades_trees.grow_sapling(pos, check_light)
local node = minetest.get_node(pos, check_light)
if node.name == "hades_trees:sapling" then
@ -47,7 +49,7 @@ function hades_trees.generate_tree(pos, check_light, trunk, leaves, underground,
leaves = "hades_trees:leaves"
end
if not underground then
underground = {"hades_core:dirt", "hades_core:dirt_with_grass"}
underground = default_underground
end
pos.y = pos.y-1
local nodename = minetest.get_node(pos).name
@ -155,7 +157,7 @@ function hades_trees.generate_olivetree(pos, check_light, trunk, leaves, undergr
leaves = "hades_trees:olive_leaves"
end
if not underground then
underground = {"hades_core:dirt", "hades_core:dirt_with_grass"}
underground = default_underground
end
if not replacements then
replacements = {["hades_trees:olive"]=10}
@ -172,7 +174,7 @@ function hades_trees.generate_orangetree(pos, check_light, trunk, leaves, underg
leaves = "hades_trees:orange_leaves"
end
if not underground then
underground = {"hades_core:dirt", "hades_core:dirt_with_grass"}
underground = default_underground
end
if not replacements then
replacements = {["hades_trees:orange"]=20}
@ -190,7 +192,7 @@ function hades_trees.generate_cocoatree(pos, check_light, trunk, leaves, undergr
leaves = "hades_trees:jungle_leaves"
end
if not underground then
underground = {"hades_core:dirt", "hades_core:dirt_with_grass"}
underground = default_underground
end
if not replacements then
replacements = {["hades_trees:cocoa_pod"]=12}
@ -207,7 +209,7 @@ function hades_trees.generate_coconutpalm(pos, check_light, trunk, leaves, under
leaves = "hades_trees:jungle_leaves"
end
if not underground then
underground = {"hades_core:dirt", "hades_core:dirt_with_grass"}
underground = default_underground
end
if not replacements then
replacements = {["hades_trees:coconut"]=20}
@ -224,7 +226,10 @@ function hades_trees.generate_paletree(pos, check_light, trunk, leaves, undergro
leaves = "hades_trees:pale_leaves"
end
if not underground then
underground = {"hades_core:dirt", "hades_core:dirt_with_grass", "hades_core:ash", "hades_core:volcanic_sand", "hades_core:fertile_sand"}
underground = table.copy(default_underground)
table.insert(underground, "hades_core:ash")
table.insert(underground, "hades_core:volcanic_sand")
table.insert(underground, "hades_core:fertile_sand")
end
pos.y = pos.y-1
local nodename = minetest.get_node(pos).name
@ -314,7 +319,7 @@ function hades_trees.generate_birchtree(pos, check_light, trunk, leaves, undergr
leaves = "hades_trees:birch_leaves"
end
if not underground then
underground = {"hades_core:dirt", "hades_core:dirt_with_grass"}
underground = default_underground
end
pos.y = pos.y-1
local nodename = minetest.get_node(pos).name
@ -407,7 +412,7 @@ function hades_trees.generate_cjtree(pos, check_light, trunk, leaves, undergroun
leaves = "hades_trees:cultivated_jungle_leaves"
end
if not underground then
underground = {"hades_core:dirt", "hades_core:dirt_with_grass"}
underground = default_underground
end
pos.y = pos.y-1
@ -502,7 +507,7 @@ function hades_trees.generate_jungletree(pos, check_light)
local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name
local ret = false
for _,name in ipairs({"hades_core:dirt", "hades_core:dirt_with_grass"}) do
for _,name in ipairs(default_underground{}) do
if nu == name then
ret = true
break
@ -591,7 +596,7 @@ function hades_trees.generate_appletree(pos, check_light, is_apple_tree)
local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name
local ret = false
for _,name in ipairs({"hades_core:dirt", "hades_core:dirt_with_grass"}) do
for _,name in ipairs(default_underground) do
if nu == name then
ret = true
break
@ -691,7 +696,7 @@ function hades_trees.generate_bananatree(pos, check_light, trunk, leaves, underg
leaves = "hades_trees:banana_leaves"
end
if not underground then
underground = {"hades_core:dirt", "hades_core:dirt_with_grass"}
underground = default_underground
end
if not replacements then
replacements = {["hades_trees:banana"]=9}

View File

@ -362,7 +362,7 @@ plantslib:spawn_on_surfaces({
spawn_delay = spawn_interval,
spawn_plants = {"hades_vines:cave"},
spawn_chance = 50,
spawn_surfaces = {"hades_core:dirt_with_grass","hades_core:dirt"},
spawn_surfaces = {"hades_core:dirt_with_grass","hades_core:dirt_with_grass_l1","hades_core:dirt_with_grass_l2","hades_core:dirt_with_grass_l3","hades_core:dirt"},
spawn_on_bottom = true,
plantlife_limit = -0.9,
})