Add support for Minetest protection API

This commit is contained in:
Wuzzy 2019-09-25 21:54:22 +02:00
parent 74d2970add
commit 1d9e7a44ae
11 changed files with 152 additions and 7 deletions

View File

@ -18,10 +18,14 @@ for b=1, #water_buckets do
liquids_pointable = true, liquids_pointable = true,
groups = { bucket = 2, bucket_water = 1 }, groups = { bucket = 2, bucket_water = 1 },
on_place = function(itemstack, user, pointed_thing) on_place = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then return end if pointed_thing.type ~= "node" then return itemstack end
local pos_protected = minetest.get_pointed_thing_position(pointed_thing, true) local pos_protected = minetest.get_pointed_thing_position(pointed_thing, true)
if minetest.is_protected(pos_protected, user) then return end if minetest.is_protected(pos_protected, user:get_player_name()) and
not minetest.check_player_privs(user, "protection_bypass") then
minetest.record_protection_violation(pos_protected, user:get_player_name())
return itemstack
end
local inv=user:get_inventory() local inv=user:get_inventory()
@ -69,6 +73,13 @@ minetest.register_craftitem(
on_use = function(itemstack, user, pointed_thing) on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then return end if pointed_thing.type ~= "node" then return end
local pos_protected = minetest.get_pointed_thing_position(pointed_thing, true)
if minetest.is_protected(pos_protected, user:get_player_name()) and
not minetest.check_player_privs(user, "protection_bypass") then
minetest.record_protection_violation(pos_protected, user:get_player_name())
return
end
local nodename=minetest.get_node(pointed_thing.under).name local nodename=minetest.get_node(pointed_thing.under).name
local replace_bucket = function(itemstack, new_bucket) local replace_bucket = function(itemstack, new_bucket)

View File

@ -1,5 +1,24 @@
local S = minetest.get_translator("default") local S = minetest.get_translator("default")
local protection_check_move = function(pos, from_list, from_index, to_list, to_index, count, player)
if minetest.is_protected(pos, player:get_player_name()) and
not minetest.check_player_privs(player, "protection_bypass") then
minetest.record_protection_violation(pos, player:get_player_name())
return 0
else
return count
end
end
local protection_check_put_take = function(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) and
not minetest.check_player_privs(player, "protection_bypass") then
minetest.record_protection_violation(pos, player:get_player_name())
return 0
else
return stack:get_count()
end
end
-- Chest and bookshelf -- Chest and bookshelf
minetest.register_node( minetest.register_node(
@ -22,6 +41,9 @@ minetest.register_node(
inv:set_size("main", 8 * 4) inv:set_size("main", 8 * 4)
end, end,
-- Unlike other inventory nodes in this game, chests are NOT subject to protection.
-- This is done to allow something like "public chests" in protected areas.
-- To protect their belongings, players are supposed locked chests instead.
can_dig = function(pos, player) can_dig = function(pos, player)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
@ -66,6 +88,9 @@ minetest.register_node(
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("main", 4*2) inv:set_size("main", 4*2)
end, end,
allow_metadata_inventory_move = protection_check_move,
allow_metadata_inventory_put = protection_check_put_take,
allow_metadata_inventory_take = protection_check_put_take,
can_dig = function(pos,player) can_dig = function(pos,player)
local meta = minetest.get_meta(pos); local meta = minetest.get_meta(pos);
local inv = meta:get_inventory() local inv = meta:get_inventory()

View File

@ -96,6 +96,13 @@ minetest.register_craftitem(
on_place = function(itemstack, user, pointed_thing) on_place = function(itemstack, user, pointed_thing)
local pos = pointed_thing.above local pos = pointed_thing.above
local pos_protected = minetest.get_pointed_thing_position(pointed_thing, true)
if minetest.is_protected(pos_protected, user:get_player_name()) and
not minetest.check_player_privs(user, "protection_bypass") then
minetest.record_protection_violation(pos_protected, user:get_player_name())
return itemstack
end
local undernode = minetest.get_node(pointed_thing.under) local undernode = minetest.get_node(pointed_thing.under)
local diff = vector.subtract(pointed_thing.above, pointed_thing.under) local diff = vector.subtract(pointed_thing.above, pointed_thing.under)

View File

@ -61,6 +61,25 @@ form_furnace = form_furnace .. "image[3.25,1.75;1,1;ui_arrow_bg.png^[transformR2
default.ui.register_page("default_furnace_inactive", form_furnace) default.ui.register_page("default_furnace_inactive", form_furnace)
local protection_check_move = function(pos, from_list, from_index, to_list, to_index, count, player)
if minetest.is_protected(pos, player:get_player_name()) and
not minetest.check_player_privs(player, "protection_bypass") then
minetest.record_protection_violation(pos, player:get_player_name())
return 0
else
return count
end
end
local protection_check_put_take = function(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) and
not minetest.check_player_privs(player, "protection_bypass") then
minetest.record_protection_violation(pos, player:get_player_name())
return 0
else
return stack:get_count()
end
end
minetest.register_node( minetest.register_node(
"default:furnace", "default:furnace",
{ {
@ -81,6 +100,9 @@ minetest.register_node(
inv:set_size("src", 1) inv:set_size("src", 1)
inv:set_size("dst", 4) inv:set_size("dst", 4)
end, end,
allow_metadata_inventory_move = protection_check_move,
allow_metadata_inventory_put = protection_check_put_take,
allow_metadata_inventory_take = protection_check_put_take,
can_dig = function(pos,player) can_dig = function(pos,player)
local meta = minetest.get_meta(pos); local meta = minetest.get_meta(pos);
local inv = meta:get_inventory() local inv = meta:get_inventory()
@ -117,6 +139,9 @@ minetest.register_node(
inv:set_size("src", 1) inv:set_size("src", 1)
inv:set_size("dst", 4) inv:set_size("dst", 4)
end, end,
allow_metadata_inventory_move = protection_check_move,
allow_metadata_inventory_put = protection_check_put_take,
allow_metadata_inventory_take = protection_check_put_take,
can_dig = function(pos,player) can_dig = function(pos,player)
local meta = minetest.get_meta(pos); local meta = minetest.get_meta(pos);
local inv = meta:get_inventory() local inv = meta:get_inventory()

View File

@ -33,6 +33,11 @@ minetest.register_node(
end, end,
on_receive_fields = function(pos, formname, fields, sender) on_receive_fields = function(pos, formname, fields, sender)
if fields.text == nil then return end if fields.text == nil then return end
if minetest.is_protected(pos, sender:get_player_name()) and
not minetest.check_player_privs(sender, "protection_bypass") then
minetest.record_protection_violation(pos, sender:get_player_name())
return itemstack
end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local text = fields.text local text = fields.text
if string.len(text) > SIGN_MAX_TEXT_LENGTH then if string.len(text) > SIGN_MAX_TEXT_LENGTH then

View File

@ -709,6 +709,12 @@ minetest.register_tool(
if pointed_thing.type ~= "node" then return end if pointed_thing.type ~= "node" then return end
local pos = pointed_thing.under local pos = pointed_thing.under
if minetest.is_protected(pos, user:get_player_name()) and
not minetest.check_player_privs(user, "protection_bypass") then
minetest.record_protection_violation(pos, user:get_player_name())
return itemstack
end
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local nodename = node.name local nodename = node.name

View File

@ -184,6 +184,25 @@ minetest.register_craftitem(
-- Nodes -- Nodes
local protection_check_move = function(pos, from_list, from_index, to_list, to_index, count, player)
if minetest.is_protected(pos, player:get_player_name()) and
not minetest.check_player_privs(player, "protection_bypass") then
minetest.record_protection_violation(pos, player:get_player_name())
return 0
else
return count
end
end
local protection_check_put_take = function(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) and
not minetest.check_player_privs(player, "protection_bypass") then
minetest.record_protection_violation(pos, player:get_player_name())
return 0
else
return stack:get_count()
end
end
minetest.register_node( minetest.register_node(
"jewels:bench", "jewels:bench",
{ {
@ -209,10 +228,18 @@ minetest.register_node(
return inv:is_empty("main") return inv:is_empty("main")
end, end,
allow_metadata_inventory_move = protection_check_move,
allow_metadata_inventory_put = protection_check_put_take,
allow_metadata_inventory_take = protection_check_put_take,
on_punch = function(pos, node, player, pointed_thing) on_punch = function(pos, node, player, pointed_thing)
local itemstack = player:get_wielded_item() local itemstack = player:get_wielded_item()
local itemstack_changed = false
if itemstack:get_name() == "jewels:jewel" then if itemstack:get_name() == "jewels:jewel" then
if minetest.is_protected(pos, player:get_player_name()) and
not minetest.check_player_privs(player, "protection_bypass") then
minetest.record_protection_violation(pos, player:get_player_name())
return
end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
@ -223,6 +250,7 @@ minetest.register_node(
if not minetest.settings:get_bool("creative_mode") then if not minetest.settings:get_bool("creative_mode") then
itemstack:take_item() itemstack:take_item()
itemstack_changed = true
end end
minetest.sound_play({name="jewels_jewelling_a_tool"}, {gain=0.8, pos=pos, max_hear_distance=8}) minetest.sound_play({name="jewels_jewelling_a_tool"}, {gain=0.8, pos=pos, max_hear_distance=8})
@ -233,7 +261,9 @@ minetest.register_node(
end end
end end
if itemstack_changed then
player:set_wielded_item(itemstack) player:set_wielded_item(itemstack)
end
end, end,
}) })

View File

@ -63,6 +63,12 @@ minetest.register_tool(
return itemstack return itemstack
end end
local pos = pointed_thing.under local pos = pointed_thing.under
if minetest.is_protected(pos, player:get_player_name()) and
not minetest.check_player_privs(player, "protection_bypass") then
minetest.record_protection_violation(pos, player:get_player_name())
return itemstack
end
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
if minetest.get_item_group(node.name, "locked") == 0 then if minetest.get_item_group(node.name, "locked") == 0 then
return itemstack return itemstack
@ -197,6 +203,11 @@ minetest.register_node(
end end
end, end,
allow_metadata_inventory_move = function(pos, from_l, from_i, to_l, to_i, cnt, player) allow_metadata_inventory_move = function(pos, from_l, from_i, to_l, to_i, cnt, player)
if minetest.is_protected(pos, player:get_player_name()) and
not minetest.check_player_privs(player, "protection_bypass") then
minetest.record_protection_violation(pos, player:get_player_name())
return 0
end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if locks.is_locked(meta, player) then if locks.is_locked(meta, player) then
return 0 return 0
@ -204,6 +215,11 @@ minetest.register_node(
return cnt return cnt
end, end,
allow_metadata_inventory_put = function(pos, listname, index, itemstack, player) allow_metadata_inventory_put = function(pos, listname, index, itemstack, player)
if minetest.is_protected(pos, player:get_player_name()) and
not minetest.check_player_privs(player, "protection_bypass") then
minetest.record_protection_violation(pos, player:get_player_name())
return 0
end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if locks.is_locked(meta, player) then if locks.is_locked(meta, player) then
return 0 return 0
@ -211,6 +227,11 @@ minetest.register_node(
return itemstack:get_count() return itemstack:get_count()
end, end,
allow_metadata_inventory_take = function(pos, listname, index, itemstack, player) allow_metadata_inventory_take = function(pos, listname, index, itemstack, player)
if minetest.is_protected(pos, player:get_player_name()) and
not minetest.check_player_privs(player, "protection_bypass") then
minetest.record_protection_violation(pos, player:get_player_name())
return 0
end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if locks.is_locked(meta, player) then if locks.is_locked(meta, player) then
return 0 return 0

View File

@ -1600,8 +1600,13 @@ function mobs:register_egg(mob, desc, background)
return itemstack return itemstack
end end
local pos = pointed_thing.above local pos = pointed_thing.above
if pointed_thing.above if pointed_thing.above then
and not minetest.is_protected(pos, placer:get_player_name()) then if minetest.is_protected(pos, placer:get_player_name()) and
not minetest.check_player_privs(placer, "protection_bypass") then
minetest.record_protection_violation(pos, placer:get_player_name())
return itemstack
end
pos.y = pos.y + 0.5 pos.y = pos.y + 0.5
local mob = minetest.add_entity(pos, mob) local mob = minetest.add_entity(pos, mob)
local ent = mob:get_luaentity() local ent = mob:get_luaentity()

View File

@ -135,7 +135,12 @@ if minetest.settings:get_bool("music_enable") then
music.stop(pos) music.stop(pos)
end, end,
on_rightclick = function(pos) on_rightclick = function(pos, node, clicker)
if minetest.is_protected(pos, clicker:get_player_name()) and
not minetest.check_player_privs(clicker, "protection_bypass") then
minetest.record_protection_violation(pos, clicker:get_player_name())
return
end
music.toggle(pos) music.toggle(pos)
end, end,

View File

@ -265,6 +265,11 @@ minetest.register_node(
local itemname = item:get_name() local itemname = item:get_name()
if itemname == "default:flint_and_steel" then if itemname == "default:flint_and_steel" then
if minetest.is_protected(pos, puncher:get_player_name()) and
not minetest.check_player_privs(puncher, "protection_bypass") then
minetest.record_protection_violation(pos, puncher:get_player_name())
return
end
if not minetest.settings:get_bool("creative_mode") then if not minetest.settings:get_bool("creative_mode") then
item:add_wear(800) item:add_wear(800)
puncher:set_wielded_item(item) puncher:set_wielded_item(item)