From 96940ddb5c4ffba2110feef2c8df67b39057299b Mon Sep 17 00:00:00 2001 From: 1F616EMO Date: Fri, 19 Jul 2024 09:23:20 +0800 Subject: [PATCH 1/5] Apply area protections on storage nodes --- nodes/node_battery_holder.lua | 28 +++++++++++- nodes/node_storage.lua | 83 ++++++++++++++++++++++++++++++++++- 2 files changed, 108 insertions(+), 3 deletions(-) diff --git a/nodes/node_battery_holder.lua b/nodes/node_battery_holder.lua index 1d5a6c7..f68f4d9 100644 --- a/nodes/node_battery_holder.lua +++ b/nodes/node_battery_holder.lua @@ -65,7 +65,7 @@ local def = { end, -- Allow all items with energy storage to be placed in the inventory - allow_metadata_inventory_put = function(_, listname, _, stack) + allow_metadata_inventory_put = function(pos, listname, _, stack, player) if listname == "batteries" then if not minetest.global_exists("technic") then return 0 @@ -80,6 +80,12 @@ local def = { -- And specifically if they hold any charge -- Disregard empty batteries, the player should know better if md and md.charge > 0 then + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + return stack:get_count() else return 0 @@ -92,6 +98,26 @@ local def = { return 0 end, + allow_metadata_inventory_move = function(pos, _, _, _, _, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + + return count + end, + + allow_metadata_inventory_take = function(pos, _, _, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + + return stack:get_count() + end, + can_dig = function(pos) local meta = minetest.get_meta(pos) diff --git a/nodes/node_storage.lua b/nodes/node_storage.lua index 7828556..ce1dd0f 100644 --- a/nodes/node_storage.lua +++ b/nodes/node_storage.lua @@ -74,6 +74,36 @@ minetest.register_node("digtron:inventory", set_logger({ return inv:is_empty("main") end, + allow_metadata_inventory_put = function(pos, _, _, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + + return stack:get_count() + end, + + allow_metadata_inventory_move = function(pos, _, _, _, _, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + + return count + end, + + allow_metadata_inventory_take = function(pos, _, _, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + + return stack:get_count() + end, + -- Pipeworks compatibility ---------------------------------------------------------------- @@ -150,9 +180,16 @@ minetest.register_node("digtron:fuelstore", set_logger({ end, -- Only allow fuel items to be placed in fuel - allow_metadata_inventory_put = function(_, listname, _, stack) + allow_metadata_inventory_put = function(pos, listname, _, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + if listname == "fuel" then if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then + return stack:get_count() else return 0 @@ -161,6 +198,26 @@ minetest.register_node("digtron:fuelstore", set_logger({ return 0 end, + allow_metadata_inventory_move = function(pos, _, _, _, _, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + + return count + end, + + allow_metadata_inventory_take = function(pos, _, _, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + + return stack:get_count() + end, + can_dig = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -250,7 +307,13 @@ minetest.register_node("digtron:combined_storage", set_logger({ end, -- Only allow fuel items to be placed in fuel - allow_metadata_inventory_put = function(_, listname, _, stack) + allow_metadata_inventory_put = function(pos, listname, _, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + if listname == "fuel" then if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then return stack:get_count() @@ -262,6 +325,12 @@ minetest.register_node("digtron:combined_storage", set_logger({ end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, _, count) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + if to_list == "main" then return count end @@ -275,6 +344,16 @@ minetest.register_node("digtron:combined_storage", set_logger({ return 0 end, + allow_metadata_inventory_take = function(pos, _, _, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + + return stack:get_count() + end, + can_dig = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() From 3237b6328b3372482d2f9baaea5b77e30fe53b8e Mon Sep 17 00:00:00 2001 From: 1F616EMO Date: Fri, 19 Jul 2024 09:32:24 +0800 Subject: [PATCH 2/5] Fix player undefined --- nodes/node_storage.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/node_storage.lua b/nodes/node_storage.lua index ce1dd0f..2074741 100644 --- a/nodes/node_storage.lua +++ b/nodes/node_storage.lua @@ -324,7 +324,7 @@ minetest.register_node("digtron:combined_storage", set_logger({ return stack:get_count() -- otherwise, allow all drops end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, _, count) + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, _, count, player) local name = player:get_player_name() if minetest.is_protected(pos, name) then minetest.record_protection_violation(pos, name) From 3af5eba0793fa120ec3620f1601119e08fed7659 Mon Sep 17 00:00:00 2001 From: 1F616EMO Date: Thu, 22 Aug 2024 09:17:54 +0800 Subject: [PATCH 3/5] Reuse codes, and add code for duplicator inventory --- nodes/node_battery_holder.lua | 26 ++--------- nodes/node_duplicator.lua | 10 ++++- nodes/node_storage.lua | 81 +++++------------------------------ util.lua | 21 +++++++++ 4 files changed, 44 insertions(+), 94 deletions(-) diff --git a/nodes/node_battery_holder.lua b/nodes/node_battery_holder.lua index f68f4d9..c869a0f 100644 --- a/nodes/node_battery_holder.lua +++ b/nodes/node_battery_holder.lua @@ -80,17 +80,13 @@ local def = { -- And specifically if they hold any charge -- Disregard empty batteries, the player should know better if md and md.charge > 0 then - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) + if digtron.check_protected_and_record(pos, player) then return 0 end - return stack:get_count() else return 0 end - else return 0 end @@ -98,25 +94,9 @@ local def = { return 0 end, - allow_metadata_inventory_move = function(pos, _, _, _, _, count, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - - return count - end, - - allow_metadata_inventory_take = function(pos, _, _, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end + allow_metadata_inventory_move = digtron.protected_allow_metadata_inventory_move, - return stack:get_count() - end, + allow_metadata_inventory_take = digtron.protected_allow_metadata_inventory_take, can_dig = function(pos) diff --git a/nodes/node_duplicator.lua b/nodes/node_duplicator.lua index aaca866..9a979d3 100644 --- a/nodes/node_duplicator.lua +++ b/nodes/node_duplicator.lua @@ -76,7 +76,11 @@ minetest.register_node("digtron:duplicator", { return inv:is_empty("main") end, - allow_metadata_inventory_put = function(_, _, _, stack) + allow_metadata_inventory_put = function(pos, _, _, stack, player) + if digtron.check_protected_and_record(pos, player) then + return 0 + end + if minetest.get_item_group(stack:get_name(), "digtron") > 0 then return stack:get_count() else @@ -84,6 +88,10 @@ minetest.register_node("digtron:duplicator", { end end, + allow_metadata_inventory_move = digtron.protected_allow_metadata_inventory_move, + + allow_metadata_inventory_take = digtron.protected_allow_metadata_inventory_take, + on_receive_fields = function(pos, _, fields, sender) local player_name = sender:get_player_name() if fields.help then diff --git a/nodes/node_storage.lua b/nodes/node_storage.lua index 2074741..afbc8f1 100644 --- a/nodes/node_storage.lua +++ b/nodes/node_storage.lua @@ -74,35 +74,11 @@ minetest.register_node("digtron:inventory", set_logger({ return inv:is_empty("main") end, - allow_metadata_inventory_put = function(pos, _, _, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - - return stack:get_count() - end, - - allow_metadata_inventory_move = function(pos, _, _, _, _, count, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - - return count - end, + allow_metadata_inventory_put = digtron.protected_allow_metadata_inventory_put, - allow_metadata_inventory_take = function(pos, _, _, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end + allow_metadata_inventory_move = digtron.protected_allow_metadata_inventory_move, - return stack:get_count() - end, + allow_metadata_inventory_take = digtron.protected_allow_metadata_inventory_take, -- Pipeworks compatibility ---------------------------------------------------------------- @@ -181,42 +157,19 @@ minetest.register_node("digtron:fuelstore", set_logger({ -- Only allow fuel items to be placed in fuel allow_metadata_inventory_put = function(pos, listname, _, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) + if digtron.check_protected_and_record(pos, player) then return 0 end - if listname == "fuel" then - if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then - - return stack:get_count() - else - return 0 - end + if listname == "fuel" and minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then + return stack:get_count() end return 0 end, - allow_metadata_inventory_move = function(pos, _, _, _, _, count, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - - return count - end, - - allow_metadata_inventory_take = function(pos, _, _, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end + allow_metadata_inventory_move = digtron.protected_allow_metadata_inventory_move, - return stack:get_count() - end, + allow_metadata_inventory_take = digtron.protected_allow_metadata_inventory_take, can_dig = function(pos) local meta = minetest.get_meta(pos) @@ -308,9 +261,7 @@ minetest.register_node("digtron:combined_storage", set_logger({ -- Only allow fuel items to be placed in fuel allow_metadata_inventory_put = function(pos, listname, _, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) + if digtron.check_protected_and_record(pos, player) then return 0 end @@ -325,9 +276,7 @@ minetest.register_node("digtron:combined_storage", set_logger({ end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, _, count, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) + if digtron.check_protected_and_record(pos, player) then return 0 end @@ -344,15 +293,7 @@ minetest.register_node("digtron:combined_storage", set_logger({ return 0 end, - allow_metadata_inventory_take = function(pos, _, _, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - - return stack:get_count() - end, + allow_metadata_inventory_take = digtron.protected_allow_metadata_inventory_take, can_dig = function(pos) local meta = minetest.get_meta(pos) diff --git a/util.lua b/util.lua index f18997c..e259fa1 100644 --- a/util.lua +++ b/util.lua @@ -428,3 +428,24 @@ digtron.show_offset_markers = function(pos, offset, period) if entity ~= nil then entity:set_yaw(1.5708) end end end + +digtron.check_protected_and_record = function(pos, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return true + end + return false +end + +digtron.protected_allow_metadata_inventory_put = function(pos, _, _, stack, player) + return digtron.check_protected_and_record(pos, player) and 0 or stack:get_count() +end + +digtron.protected_allow_metadata_inventory_move = function(pos, _, _, _, _, count, player) + return digtron.check_protected_and_record(pos, player) and 0 or count +end + +digtron.protected_allow_metadata_inventory_take = function(pos, _, _, stack, player) + return digtron.check_protected_and_record(pos, player) and 0 or stack:get_count() +end From 56aa51ef70e8f36ba3a9918696c935ba89f897c4 Mon Sep 17 00:00:00 2001 From: 1F616EMO Date: Thu, 22 Aug 2024 09:21:37 +0800 Subject: [PATCH 4/5] Add code for controller and builder --- nodes/node_builders.lua | 14 ++++++++++---- nodes/node_controllers.lua | 15 +++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/nodes/node_builders.lua b/nodes/node_builders.lua index fa261ab..085ae75 100644 --- a/nodes/node_builders.lua +++ b/nodes/node_builders.lua @@ -259,7 +259,11 @@ minetest.register_node("digtron:builder", { digtron.update_builder_item(pos) end, - allow_metadata_inventory_put = function(pos, listname, index, stack) + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if digtron.check_protected_and_record(pos, player) then + return 0 + end + local stack_name = stack:get_name() if minetest.get_item_group(stack_name, "digtron") ~= 0 then @@ -285,9 +289,11 @@ minetest.register_node("digtron:builder", { end, allow_metadata_inventory_take = function(pos, listname, index) - node_inventory_table.pos = pos - local inv = minetest.get_inventory(node_inventory_table) - inv:set_stack(listname, index, ItemStack("")) + if not digtron.check_protected_and_record(pos, player) then + node_inventory_table.pos = pos + local inv = minetest.get_inventory(node_inventory_table) + inv:set_stack(listname, index, ItemStack("")) + end return 0 end, diff --git a/nodes/node_controllers.lua b/nodes/node_controllers.lua index 36e7856..391ce46 100644 --- a/nodes/node_controllers.lua +++ b/nodes/node_controllers.lua @@ -237,8 +237,9 @@ minetest.register_node("digtron:auto_controller", { inv:set_size("stop", 1) end, - allow_metadata_inventory_put = function(pos, listname, index, stack) - if minetest.get_item_group(stack:get_name(), "digtron") ~= 0 then + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if digtron.check_protected_and_record(pos, player) + or minetest.get_item_group(stack:get_name(), "digtron") ~= 0 then return 0 -- pointless setting a Digtron node as a stop block end node_inventory_table.pos = pos @@ -247,10 +248,12 @@ minetest.register_node("digtron:auto_controller", { return 0 end, - allow_metadata_inventory_take = function(pos, listname, index) - node_inventory_table.pos = pos - local inv = minetest.get_inventory(node_inventory_table) - inv:set_stack(listname, index, ItemStack("")) + allow_metadata_inventory_take = function(pos, listname, index, _, player) + if not digtron.check_protected_and_record(pos, player) then + node_inventory_table.pos = pos + local inv = minetest.get_inventory(node_inventory_table) + inv:set_stack(listname, index, ItemStack("")) + end return 0 end, From e07777fdbd8f8eb0b0e1a61755f4d0caf409033f Mon Sep 17 00:00:00 2001 From: 1F616EMO Date: Thu, 22 Aug 2024 09:52:40 +0800 Subject: [PATCH 5/5] Fix luacheck --- nodes/node_builders.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/node_builders.lua b/nodes/node_builders.lua index 085ae75..c6410a4 100644 --- a/nodes/node_builders.lua +++ b/nodes/node_builders.lua @@ -288,7 +288,7 @@ minetest.register_node("digtron:builder", { return 0 end, - allow_metadata_inventory_take = function(pos, listname, index) + allow_metadata_inventory_take = function(pos, listname, index, _, player) if not digtron.check_protected_and_record(pos, player) then node_inventory_table.pos = pos local inv = minetest.get_inventory(node_inventory_table)