diff --git a/init.lua b/init.lua index 0dec9e5..dc7d733 100644 --- a/init.lua +++ b/init.lua @@ -44,6 +44,27 @@ else dofile(worldpath.."/moretrees_settings.txt") end +-- Boilerplate to support localized strings if intllib mod is installed. + +local S +if moretrees.intllib_modpath then + dofile(moretrees.intllib_modpath.."/intllib.lua") + S = intllib.Getter(minetest.get_current_modname()) +else + S = function ( s ) return s end +end +moretrees.gettext = S + +-- infinite stacks checking + +if minetest.get_modpath("unified_inventory") or not minetest.setting_getbool("creative_mode") then + moretrees.expect_infinite_stacks = false +else + moretrees.expect_infinite_stacks = true +end + +-- tables, load other files + moretrees.cutting_tools = { "default:axe_bronze", "default:axe_diamond", @@ -56,6 +77,7 @@ moretrees.cutting_tools = { "titanium:axe", } +dofile(modpath.."/ownership.lua") dofile(modpath.."/tree_models.lua") dofile(modpath.."/node_defs.lua") dofile(modpath.."/biome_defs.lua") diff --git a/node_defs.lua b/node_defs.lua index 897a3c7..a4f1346 100644 --- a/node_defs.lua +++ b/node_defs.lua @@ -40,6 +40,14 @@ for i in ipairs(moretrees.treelist) do is_ground_content = true, groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, sounds = default.node_sound_wood_defaults(), + on_place = function(itemstack, placer, pointed_thing) + local keys=placer:get_player_control() + local pos = pointed_thing.under + if not moretrees:node_is_owned(pos, placer) then + minetest.rotate_and_place(itemstack, placer, pointed_thing, + moretrees.expect_infinite_stacks, { invert_wall = keys.sneak }) + end + end }) minetest.register_node("moretrees:"..treename.."_planks", { @@ -378,6 +386,14 @@ minetest.register_node("moretrees:rubber_tree_trunk_empty", { groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, sounds = default.node_sound_wood_defaults(), paramtype2 = "facedir", + on_place = function(itemstack, placer, pointed_thing) + local keys=placer:get_player_control() + local pos = pointed_thing.under + if not moretrees:node_is_owned(pos, placer) then + minetest.rotate_and_place(itemstack, placer, pointed_thing, + moretrees.expect_infinite_stacks, { invert_wall = keys.sneak }) + end + end }) minetest.register_abm({ diff --git a/ownership.lua b/ownership.lua new file mode 100644 index 0000000..e075888 --- /dev/null +++ b/ownership.lua @@ -0,0 +1,35 @@ + +local S = moretrees.gettext + +function moretrees:node_is_owned(pos, placer) + local ownername = false + if type(IsPlayerNodeOwner) == "function" then -- node_ownership mod + if HasOwner(pos, placer) then -- returns true if the node is owned + if not IsPlayerNodeOwner(pos, placer:get_player_name()) then + if type(getLastOwner) == "function" then -- ...is an old version + ownername = getLastOwner(pos) + elseif type(GetNodeOwnerName) == "function" then -- ...is a recent version + ownername = GetNodeOwnerName(pos) + else + ownername = S("someone") + end + end + end + + elseif type(isprotect)=="function" then -- glomie's protection mod + if not isprotect(5, pos, placer) then + ownername = S("someone") + end + elseif type(protector)=="table" and type(protector.can_dig)=="function" then -- Zeg9's protection mod + if not protector.can_dig(5, pos, placer) then + ownername = S("someone") + end + end + + if ownername ~= false then + minetest.chat_send_player( placer:get_player_name(), S("Sorry, %s owns that spot."):format(ownername) ) + return true + else + return false + end +end