Skip to content

Commit 5886a23

Browse files
committed
Protection support
1 parent 38cbe02 commit 5886a23

File tree

3 files changed

+71
-20
lines changed

3 files changed

+71
-20
lines changed

mods/default/furnace.lua

+34-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,15 @@ minetest.override_item("default:furnace", {
129129
can_dig = function(pos, player)
130130
local meta = minetest.get_meta(pos)
131131
local inv = meta:get_inventory()
132-
return inv:is_empty("fuel") and inv:is_empty("src") and inv:is_empty("dest")
132+
if inv:is_empty("fuel") and inv:is_empty("src") and inv:is_empty("dest") then
133+
local player_name = player:get_player_name()
134+
if minetest.is_protected(pos, player_name) then
135+
minetest.record_protection_violation(pos, player_name)
136+
return false
137+
end
138+
return true
139+
end
140+
return false
133141
end,
134142

135143
on_timer = function(pos, elapsed)
@@ -149,6 +157,31 @@ minetest.override_item("default:furnace", {
149157
return true
150158
end,
151159

160+
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
161+
local player_name = player:get_player_name()
162+
if minetest.is_protected(pos, player_name) then
163+
minetest.record_protection_violation(pos, player_name)
164+
return 0
165+
end
166+
return count
167+
end,
168+
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
169+
local player_name = player:get_player_name()
170+
if minetest.is_protected(pos, player_name) then
171+
minetest.record_protection_violation(pos, player_name)
172+
return 0
173+
end
174+
return stack:get_count()
175+
end,
176+
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
177+
local player_name = player:get_player_name()
178+
if minetest.is_protected(pos, player_name) then
179+
minetest.record_protection_violation(pos, player_name)
180+
return 0
181+
end
182+
return stack:get_count()
183+
end,
184+
152185
--on_punch = function(pos, node)
153186
-- local meta = minetest.get_meta(pos)
154187
-- print(dump(meta:to_table()))

mods/default/init.lua

+32-17
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ default.get_translator = S
3838
-- sound ideas: furnace, eating
3939
-- falling sand/gravel
4040
-- investigate long vertical shafts (mgv6 fail?)
41+
-- some particle effects
4142

4243
-- long-term TODOs?:
4344
-- consider adding unfinished features like firefly spawn & standing signs
4445
-- texture animations for some
45-
-- protection support
4646
-- 3d model signs and torches
4747
-- maybe 3d model mobs
4848

@@ -895,6 +895,10 @@ minetest.register_node("default:sign_wall", {
895895
end,
896896
on_receive_fields = function(pos, formname, fields, sender)
897897
local player_name = sender:get_player_name()
898+
if minetest.is_protected(pos, player_name) then
899+
minetest.record_protection_violation(pos, player_name)
900+
return
901+
end
898902
local meta = minetest.get_meta(pos)
899903
local text = fields.text
900904
if not text then
@@ -911,6 +915,20 @@ minetest.register_node("default:sign_wall", {
911915
end,
912916
})
913917

918+
local function can_dig_chest(pos, player)
919+
local meta = minetest.get_meta(pos)
920+
local inv = meta:get_inventory()
921+
if not inv:is_empty("main") then
922+
return false
923+
end
924+
local player_name = player:get_player_name()
925+
if minetest.is_protected(pos, player_name) then
926+
minetest.record_protection_violation(pos, player_name)
927+
return false
928+
end
929+
return true
930+
end
931+
914932
minetest.register_node("default:chest", {
915933
description = S("Chest"),
916934
tiles = { "chest_top.png", "chest_top.png", "chest_side.png", "chest_side.png", "chest_side.png", "chest_front.png" },
@@ -929,22 +947,22 @@ minetest.register_node("default:chest", {
929947
local inv = meta:get_inventory()
930948
inv:set_size("main", 8*4)
931949
end,
932-
can_dig = function(pos, player)
933-
local meta = minetest.get_meta(pos)
934-
local inv = meta:get_inventory()
935-
return inv:is_empty("main")
936-
end,
950+
can_dig = can_dig_chest,
937951
})
938952

939953
local function can_use_locked_chest(meta, player)
940-
if meta:get_string("owner") == player:get_player_name() then
941-
return true
954+
local player_name = player:get_player_name()
955+
if meta:get_string("owner") ~= player_name then
956+
-- 0.3 uses the 'server' priv for this
957+
if not minetest.check_player_privs(player, "protection_bypass") then
958+
return false
959+
end
942960
end
943-
-- 0.3 uses the 'server' priv for this
944-
if minetest.check_player_privs(player, "protection_bypass") then
945-
return true
961+
if minetest.is_protected(pos, player_name) then
962+
minetest.record_protection_violation(pos, player_name)
963+
return false
946964
end
947-
return false
965+
return true
948966
end
949967

950968
minetest.register_node("default:chest_locked", {
@@ -970,11 +988,8 @@ minetest.register_node("default:chest_locked", {
970988
local inv = meta:get_inventory()
971989
inv:set_size("main", 8*4)
972990
end,
973-
can_dig = function(pos, player)
974-
local meta = minetest.get_meta(pos)
975-
local inv = meta:get_inventory()
976-
return inv:is_empty("main")
977-
end,
991+
-- note: can_dig_chest() does not check the owner, this is intentional.
992+
can_dig = can_dig_chest,
978993
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
979994
local meta = minetest.get_meta(pos)
980995
if not can_use_locked_chest(meta, player) then

mods/default/sao.lua

+5-2
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,15 @@ local function checkFreeAndWalkablePosition(p0, size)
5454
end
5555

5656
local function explodeSquare(p0, size)
57-
-- FIXME: callbacks / indestructability?
57+
-- FIXME: implement on_blast & item drops
5858
local positions = {}
5959
for dx = 0, size.x - 1 do
6060
for dy = 0, size.y - 1 do
6161
for dz = 0, size.z - 1 do
62-
positions[#positions+1] = vector.offset(p0, dx, dy, dz)
62+
local p = vector.offset(p0, dx, dy, dz)
63+
if not minetest.is_protected(p, "") then
64+
positions[#positions+1] = p
65+
end
6366
end
6467
end
6568
end

0 commit comments

Comments
 (0)