Work on erosion. Testing it.

master
SFENCE 2019-10-30 08:24:41 +01:00
parent 84aa558472
commit 08d9ed0706
6 changed files with 95 additions and 43 deletions

View File

@ -40,24 +40,24 @@ function default.register_changeable_node_change(node_name, change_name, change_
return
end
changable_node = default.registered_changeable_nodes[node_name];
if (changable_node==nil) then
local changeable_node = default.registered_changeable_nodes[node_name];
if (changeable_node==nil) then
default.registered_changeable_nodes[node_name] = {changes = {}};
changable_node = default.registered_changeable_nodes[node_name];
changeable_node = default.registered_changeable_nodes[node_name];
end
changable_node.changes[change_name] = change_def;
default.registered_changeable_nodes[node_name] = changable_node;
changeable_node.changes[change_name] = change_def;
default.registered_changeable_nodes[node_name] = changeable_node;
if (default.register_changeable_nodes_by_change_names[change_name]==nil) then
default.register_changeable_nodes_by_change_names[change_name] = {};
end
table.insert(default.register_changeable_nodes_by_change_names[change_name], node_name);
if (minetest.registered_nodes[node_name]~=nil) then
if (minetest.registered_nodes[node_name]==nil) then
minetest.log("error", "Changeable source node name "..node_name.." is not valid registered node name. ( for change \""..change_name.."\")")
end
if (minetest.registered_nodes[change_def.new_node_name]~=nil) then
if (minetest.registered_nodes[change_def.new_node_name]==nil) then
minetest.log("error", "Changeable target node name "..change_def.new_node_name.." is not valid registered node name. ( for change \""..change_name.."\")")
end
end
@ -68,13 +68,13 @@ function default.apply_node_change(pos, node, change_name)
node = minetest.get_node(pos);
end
changable_node = default.registered_changeable_nodes[node.name];
changeable_node = default.registered_changeable_nodes[node.name];
--minetest.log("warning", "Node "..node.name.." change "..change_name.." with data: "..dump(changable_node))
--minetest.log("warning", "Node "..node.name.." change "..change_name.." with data: "..dump(changeable_node))
--minetest.log("warning", dump(default.registered_changeable_nodes))
if (changable_node~=nil) then
local change_def = changable_node.changes[change_name];
if (changeable_node~=nil) then
local change_def = changeable_node.changes[change_name];
--minetest.log("warning","change_def: "..dump(change_def))
if (change_def~=nil) then
if ((change_def.allow_change==nil) or (change_def.allow_change(pos, node)==true)) then
@ -84,10 +84,16 @@ function default.apply_node_change(pos, node, change_name)
minetest.check_for_falling(pos);
default.neighbour_stable_to_normal(pos);
minetest.after(1, default.check_neighbour_for_fall, pos);
minetest.after(0.5, default.check_for_landslide, pos);
end
return true;
end
else
--minetest.log("warning","Node "..node.name.." have not registered change "..change_name..".")
--minetest.log("warning", dump(changeable_node));
end
else
--minetest.log("warning","Apply to no changeable node "..node.name)
end
return false;
@ -99,10 +105,10 @@ function default.is_node_changeable(pos, node, change_name)
node = minetest.get_node(pos);
end
changable_node = default.registered_changeable_nodes[node.name];
changeable_node = default.registered_changeable_nodes[node.name];
if (changable_node~=nil) then
change_def = changable_node.changes[change_name];
if (changeable_node~=nil) then
change_def = changeable_node.changes[change_name];
if (change_def~=nil) then
return true;
end

38
mods/default/erosion.lua Normal file
View File

@ -0,0 +1,38 @@
local S = default.S;
function default.erosion_air(pos, node)
minetest.log("warning", "Air erosion of node "..node.name.." pos X:"..tostring(pos.x).." Y:"..tostring(pos.y).." Z:"..tostring(pos.z))
default.apply_node_change(pos, node, "erosion");
end
function default.erosion_water(pos, node)
minetest.log("warning", "Water erosion of node "..node.name.." pos X:"..tostring(pos.x).." Y:"..tostring(pos.y).." Z:"..tostring(pos.z))
default.apply_node_change(pos, node, "erosion");
end
function default.erosion_heat(pos, node)
minetest.log("warning", "Heat erosion of node "..node.name.." pos X:"..tostring(pos.x).." Y:"..tostring(pos.y).." Z:"..tostring(pos.z))
default.apply_node_change(pos, node, "erosion");
end
function default.erosion_dry(pos, node)
minetest.log("warning", "Dry erosion of node "..node.name.." pos X:"..tostring(pos.x).." Y:"..tostring(pos.y).." Z:"..tostring(pos.z))
default.apply_node_change(pos, node, "erosion");
end
function default.erosion_wet(pos, node)
minetest.log("warning", "Wet erosion of node "..node.name.." pos X:"..tostring(pos.x).." Y:"..tostring(pos.y).." Z:"..tostring(pos.z))
default.apply_node_change(pos, node, "erosion");
end
minetest.register_abm({
label = "Air erosion",
nodenames = {"group:erosion_air"},
neighbors = {"group:air","air"},
interval = 60,
chance = 2,
catch_up = false,
action = default.erosion_air,
})

View File

@ -69,11 +69,7 @@ function default.is_should_fall(pos, node, only_firmness, to_stable)
--minetest.log("warning", "Walkable on "..dump(pos_find).." for "..dump(pos))
is_should_fall = false;
if (to_stable==true) then
node.name = default.firmness_node_to_stable[node.name];
if (node.name) then
--minetest.log("warning", "To stable "..dump(pos))
minetest.swap_node(pos, node);
end
default.apply_node_change(pos, node, "stabilization");
end
return false;
end
@ -317,13 +313,17 @@ function default.check_for_landslide(pos)
if (node_def.buildable_to==true) then
check_pos.y = pos.y - 1;
local check_node = minetest.get_node(check_pos);
if (check_node.name~="ignore") then
local node_def = minetest.registered_nodes[check_node.name];
if (node_def.buildable_to==true) then
table.insert(landslide_pos, table.copy(check_pos))
if (landslide<=100) then
local check_node = minetest.get_node(check_pos);
if (check_node.name~="ignore") then
local node_def = minetest.registered_nodes[check_node.name];
if (node_def.buildable_to==true) then
table.insert(landslide_pos, table.copy(check_pos))
end
end
else
table.insert(landslide_pos, table.copy(check_pos))
end
end
end
@ -335,7 +335,7 @@ function default.check_for_landslide(pos)
local positions = #landslide_pos;
if (positions>0) then
local chance = (default.random_generator:next(0, 65535)/65535.0)*100;
if (landslide>100) then landslide = landslide - 100; end
--minetest.log("warning", "Chance: "..tostring(chance).." Landslide: "..tostring(landslide));
if (chance<=landslide) then
@ -351,6 +351,7 @@ function default.check_for_landslide(pos)
minetest.set_node(move_pos, node);
minetest.remove_node(pos);
minetest.check_single_for_falling(move_pos);
minetest.check_for_falling(pos);
end
end
end
@ -384,6 +385,7 @@ default.firmness_node_stable_names = {};
function default.fall_stable_node(pos, node, check_cavein)
--minetest.log("warning", "fall_stable_node.");
default.apply_node_change(pos, node, "smash");
local new_node_name = default.firmness_node_to_falling[node.name];
if (new_node_name~=nil) then
--minetest.log("warning", "Falling 296: "..dump(pos));
@ -428,6 +430,10 @@ function default.register_firmness_node_change(node_name, falling_node_name, sta
end
end
function default.firmness_construct(pos)
minetest.after(0.1, default.check_for_landslide, pos);
end
function default.firmness_abm_action(pos, node)
local fall_it = default.is_should_fall(pos, node, false, true);
--minetest.log("warning", "Node on pos "..dump(pos).." fall it is "..tostring(fall_it));
@ -508,4 +514,5 @@ minetest.register_abm({
chance = 6,
catch_up = false,
action = default.firmness_abm_action,
})
}
)

View File

@ -49,6 +49,7 @@ local default_path = minetest.get_modpath("default")
dofile(default_path.."/changeable.lua")
dofile(default_path.."/rock.lua")
dofile(default_path.."/wet.lua")
dofile(default_path.."/erosion.lua")
dofile(default_path.."/firmness.lua")
dofile(default_path.."/ores.lua")

View File

@ -260,7 +260,7 @@ default.register_solid_rock("default:my_stone", {
legacy_mineral = true,
sounds = default.node_sound_stone_defaults(),
},{
groups_solid_stone={dry={firmness=3,resilience=3,cavein=25,absorbing_power=1},
groups_solid_stone={dry={firmness=3,resilience=3,cavein=25,absorbing_power=1,erosion_air=10},
damp={firmness=3,resilience=2,cavein=35,absorbing_power=1},
wet={firmness=3,resilience=1,cavein=45,absorbing_power=1},
soggy={firmness=2,resilience=1, cavein=55,absorbing_power=1}},
@ -546,7 +546,7 @@ minetest.register_node("default:dirt_with_coniferous_litter", {
minetest.register_node("default:dry_dirt", {
description = S("Dry Dirt"),
tiles = {"default_dry_dirt.png"},
groups = {crumbly = 3, falling_node, soil = 1},
groups = {crumbly = 3, falling_node=1, soil = 1},
drowning = 1,
sounds = default.node_sound_dirt_defaults(),
})
@ -556,7 +556,7 @@ minetest.register_node("default:dry_dirt_with_dry_grass", {
tiles = {"default_dry_grass.png", "default_dry_dirt.png",
{name = "default_dry_dirt.png^default_dry_grass_side.png",
tileable_vertical = false}},
groups = {crumbly = 3, falling, soil = 1},
groups = {crumbly = 3, falling_node=1, soil = 1},
drowning = 1,
drop = "default:dry_dirt",
sounds = default.node_sound_dirt_defaults({

View File

@ -71,8 +71,8 @@ function default.register_solid_rock(rock_name, rock_def, changes_def)
for index, value in pairs({"","_damp","_wet","_soggy"}) do
for change_index, change_name in pairs({"smash","erosion"}) do
default.register_changeable_node_change(rock_name..value, change_name, {new_node_name=big_stones_name..value,check_stability=yes});
default.register_changeable_node_change(big_stones_name..value, change_name, {new_node_name=medium_stones_name..value,check_stability=yes});
default.register_changeable_node_change((rock_name..value), change_name, {new_node_name=big_stones_name..value,check_stability=true});
default.register_changeable_node_change((big_stones_name..value), change_name, {new_node_name=medium_stones_name..value,check_stability=true});
end
end
end
@ -96,9 +96,7 @@ function default.register_wet_rock(rock_name, rock_def, groups)
copy_def = groups_to_def(copy_def, groups.dry);
copy_def = update_node_def(copy_def);
minetest.register_node(dry_name, copy_def);
default.register_changeable_node_change(dry_name, "wet", {new_node_name=damp_name,check_stability=false});
-- damp
copy_def = table.copy(rock_def);
copy_def = update_tiles(copy_def, "default_damp.png");
@ -108,9 +106,6 @@ function default.register_wet_rock(rock_name, rock_def, groups)
copy_def = update_node_def(copy_def);
minetest.register_node(damp_name, copy_def);
default.register_changeable_node_change(damp_name, "wet", {new_node_name=wet_name,check_stability=false});
default.register_changeable_node_change(damp_name, "dry", {new_node_name=dry_name,check_stability=false});
-- wet
copy_def = table.copy(rock_def);
copy_def = update_tiles(copy_def, "default_wet.png");
@ -119,10 +114,7 @@ function default.register_wet_rock(rock_name, rock_def, groups)
copy_def.groups.wet = 1;
copy_def = update_node_def(copy_def);
minetest.register_node(wet_name, copy_def);
default.register_changeable_node_change(wet_name, "wet", {new_node_name=soggy_name,check_stability=false});
default.register_changeable_node_change(wet_name, "dry", {new_node_name=damp_name,check_stability=false});
-- soggy
copy_def = table.copy(rock_def);
copy_def = update_tiles(copy_def, "default_soggy.png");
@ -131,7 +123,15 @@ function default.register_wet_rock(rock_name, rock_def, groups)
copy_def.groups.soggy = 1;
copy_def = update_node_def(copy_def);
minetest.register_node(soggy_name, copy_def);
-- changeable register
default.register_changeable_node_change(dry_name, "wet", {new_node_name=damp_name,check_stability=false});
default.register_changeable_node_change(damp_name, "wet", {new_node_name=wet_name,check_stability=false});
default.register_changeable_node_change(damp_name, "dry", {new_node_name=dry_name,check_stability=false});
default.register_changeable_node_change(wet_name, "wet", {new_node_name=soggy_name,check_stability=false});
default.register_changeable_node_change(wet_name, "dry", {new_node_name=damp_name,check_stability=false});
default.register_changeable_node_change(soggy_name, "dry", {new_node_name=wet_name,check_stability=false});
end