Work on erosion. Testing it.
parent
84aa558472
commit
08d9ed0706
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
})
|
||||
|
|
@ -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,
|
||||
})
|
||||
}
|
||||
)
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
|
@ -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({
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue