diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..2fb2669 --- /dev/null +++ b/README.txt @@ -0,0 +1,18 @@ +Minetest 0.4 mod: spawn_sanitizer +========================= + +License of source code: +----------------------- +Andrey's mod for minetest + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +http://www.gnu.org/licenses/lgpl-2.1.html + + +Bones at spawn are eventually cleared. All other bones are rotated if their inventory is empty. + +Also builds spawn place from cobble and adds railroad. diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..3617c60 --- /dev/null +++ b/depends.txt @@ -0,0 +1,6 @@ +default +bones +stairs +carts +tnt +bucket diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..4217515 --- /dev/null +++ b/init.lua @@ -0,0 +1,235 @@ +-- Minetest 0.4 mod: spawn_sanitizer +-- Bones are eventually removed from spawn. +-- +-- See README.txt for licensing and other information. + +spawn_sanitizer = {} +spawn_sanitizer.cleaned=false +spawn_sanitizer.timer=0 + +minetest.registered_nodes["bones:bones"].groups = {dig_immediate=3} +local facedir_for_bones = 4 + +minetest.register_abm({ + nodenames = {"bones:bones"}, + interval = 600, + chance = 1, + action = function(pos) + local owner = minetest.get_meta(pos):get_string("owner") + if owner=="" then + local node=minetest.get_node(pos) + local nodeinventory = minetest.get_meta(pos):get_inventory() + if node.param2 ~= facedir_for_bones then + if nodeinventory:is_empty("main") then + node.param2=facedir_for_bones + minetest.swap_node(pos, node) + end + end + end + end, +}) + +minetest.register_abm({ + nodenames = {"bones:bones"}, + interval = 1200, + chance = 6, + action = function(pos) + if pos.x>-80 and pos.x<80 and pos.z>-80 and pos.z<80 and pos.y>-45 then + local owner = minetest.get_meta(pos):get_string("owner") + if owner=="" then + local node=minetest.get_node(pos) + local nodeinventory = minetest.get_meta(pos):get_inventory() + if node.param2 ~= facedir_for_bones then + if not nodeinventory:is_empty("main") then + nodeinventory:remove_item("main", "default:pick_wood") + nodeinventory:remove_item("main", "default:torch") + nodeinventory:remove_item("main", "default:apple") + nodeinventory:remove_item("main", "default:cobble") + nodeinventory:remove_item("main", "default:furnace") + nodeinventory:remove_item("main", "stairs:stair_cobble") + nodeinventory:remove_item("main", "stairs:slab_cobble") + nodeinventory:remove_item("main", "bones:bones") + end + end + end + end + end, +}) + +minetest.register_abm({ + nodenames = {"bones:bones"}, + interval = 3000, + chance = 8, + action = function(pos) + if pos.x>-40 and pos.x<40 and pos.z>-40 and pos.z<40 and pos.y>-45 then + local owner = minetest.get_meta(pos):get_string("owner") + if owner=="" then + local node=minetest.get_node(pos) + local nodeinventory = minetest.get_meta(pos):get_inventory() + if node.param2 == facedir_for_bones then + if nodeinventory:is_empty("main") then + minetest.remove_node(pos) + end + end + end + end + end, +}) + +minetest.after(75, function(dtime) + + if spawn_sanitizer.cleaned==true then + return + end + + local positions1 = minetest.find_nodes_in_area( + {x=-20, y=-4, z=-20}, + {x=20, y=1, z=20}, + {"air", "default:water_flowing", "default:water_source"}) + for _, pos in ipairs(positions1) do + minetest.set_node(pos, {name="default:cobble"}) + end + local positions2 = minetest.find_nodes_in_area( + {x=-21, y=0, z=-21}, + {x=21, y=0, z=21}, + {"air", "default:water_flowing", "default:water_source"}) + for _, pos in ipairs(positions2) do + minetest.set_node(pos, {name="default:cobble"}) + end + local positions3 = minetest.find_nodes_in_area( + {x=-22, y=-1, z=-22}, + {x=22, y=-1, z=22}, + {"air", "default:water_flowing", "default:water_source"}) + for _, pos in ipairs(positions3) do + minetest.set_node(pos, {name="default:cobble"}) + end + local positions4 = minetest.find_nodes_in_area( + {x=-23, y=-2, z=-23}, + {x=23, y=-2, z=23}, + {"air", "default:water_flowing", "default:water_source"}) + for _, pos in ipairs(positions4) do + minetest.set_node(pos, {name="default:cobble"}) + end + local positions5 = minetest.find_nodes_in_area( + {x=-24, y=-3, z=-24}, + {x=24, y=-3, z=24}, + {"air", "default:water_flowing", "default:water_source"}) + for _, pos in ipairs(positions5) do + minetest.set_node(pos, {name="default:cobble"}) + end + + local positions6 = minetest.find_nodes_in_area( + {x=-19, y=2, z=-19}, + {x=19, y=70, z=19}, + {"default:cobble", "default:stone", "default:water_source", "default:lava_source"}) + for _, pos in ipairs(positions6) do + minetest.set_node(pos, {name="air"}) + end + + local positions7 = minetest.find_nodes_in_area( + {x=-50, y=-50, z=-50}, + {x=50, y=50, z=50}, + {"default:furnace"}) + for _, pos in ipairs(positions7) do + minetest.set_node(pos, {name="air"}) + end + + local positions8 = minetest.find_nodes_in_area( + {x=-3, y=-3, z=-3}, + {x=3, y=0, z=3}, + {"default:cobble"}) + for _, pos in ipairs(positions8) do + minetest.set_node(pos, {name="air"}) + end + + local positions9 = minetest.find_nodes_in_area( + {x=-2, y=1, z=-2}, + {x=2, y=2, z=2}, + {"default:tree"}) + for _, pos in ipairs(positions9) do + minetest.set_node(pos, {name="air"}) + end + + + for z1=-27, -16 do + minetest.set_node({x=37, y=2, z=z1}, {name="default:rail"}) + minetest.set_node({x=37, y=1, z=z1}, {name="default:stonebrick"}) + end + for z1=16, 29 do + minetest.set_node({x=37, y=2, z=z1}, {name="default:rail"}) + minetest.set_node({x=37, y=1, z=z1}, {name="default:stonebrick"}) + end + for z1=-15, 15 do + minetest.set_node({x=37, y=2, z=z1}, {name="carts:brakerail"}) + minetest.set_node({x=37, y=1, z=z1}, {name="default:stonebrick"}) + end + for x1=36, 17, -1 do + minetest.set_node({x=x1, y=2, z=-27}, {name="default:rail"}) + minetest.set_node({x=x1, y=2, z=29}, {name="default:rail"}) + minetest.set_node({x=x1, y=1, z=-27}, {name="default:stonebrick"}) + minetest.set_node({x=x1, y=1, z=29}, {name="default:stonebrick"}) + end + for x1=16, 2, -1 do + minetest.set_node({x=x1, y=2, z=-27}, {name="carts:powerrail"}) + minetest.set_node({x=x1, y=2, z=29}, {name="carts:powerrail"}) + minetest.set_node({x=x1, y=1, z=-27}, {name="default:stonebrick"}) + minetest.set_node({x=x1, y=1, z=29}, {name="default:stonebrick"}) + end + for z1=-26, -17 do + minetest.set_node({x=2, y=2, z=z1}, {name="default:rail"}) + minetest.set_node({x=2, y=1, z=z1}, {name="default:stonebrick"}) + end + for z1=17, 28 do + minetest.set_node({x=2, y=2, z=z1}, {name="default:rail"}) + minetest.set_node({x=2, y=1, z=z1}, {name="default:stonebrick"}) + end + for z1=-17, 17 do + minetest.set_node({x=3, y=2, z=z1}, {name="default:rail"}) + minetest.set_node({x=3, y=1, z=z1}, {name="default:stonebrick"}) + end + minetest.add_entity({x=3, y=2, z=0}, "carts:cart") + + if not spawn_sanitizer.cleaned then + spawn_sanitizer.cleaned=true + minetest.log("action", "Spawn sanitized!") + end +end) + +-- no more protection blocks at spawn! +local old_node_place = minetest.item_place +function minetest.item_place(itemstack, placer, pointed_thing) + if itemstack:get_definition().type == "node" then + local ok=true + if itemstack:get_name() == "protector_mese:protect" then + local pos = pointed_thing.above + if not placer or not placer.get_player_name then return false end + if pos.x>-21 and pos.x<21 and pos.z>-21 and pos.z<21 then + minetest.chat_send_player(placer:get_player_name(), "Spawn belongs to all") + if minetest.get_player_privs(placer:get_player_name()).delprotect then + ok=true + else + ok=false + end + end + end + if ok == true then + return old_node_place(itemstack, placer, pointed_thing) + else + return + end + end + return old_node_place(itemstack, placer, pointed_thing) +end + +-- punish for lava at spawn, by TNT! +local old_bucket_lava_on_place=minetest.registered_craftitems["bucket:bucket_lava"].on_place +minetest.registered_craftitems["bucket:bucket_lava"].on_place=function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + if pos.x>-35 and pos.x<35 and pos.y>16 and pos.z>-35 and pos.z<35 then + minetest.log("action", "Player warned for placing lava!") + minetest.set_node({x=pos.x, y=pos.y-1, z=pos.z}, {name="tnt:tnt_burning"}) + boom({x=pos.x, y=pos.y-1, z=pos.z}, math.random(1, 3)) + minetest.sound_play("tnt_ignite", {pos=pos}) + end + return old_bucket_lava_on_place(itemstack, placer, pointed_thing) +end