From 391d8e1393a6ef2132474099d822a2585625ba1a Mon Sep 17 00:00:00 2001 From: loosewheel <76670709+loosewheel@users.noreply.github.com> Date: Tue, 12 Jul 2022 19:58:17 +1000 Subject: [PATCH] Add files via upload --- breaker.lua | 5 ++ change.log | 5 ++ deployer.lua | 19 ++++-- dropper.lua | 164 ++++++++++++++++++++++++++++++++++------------- init.lua | 2 +- readme.txt | 6 +- settings.lua | 3 + settingtypes.txt | 3 + 8 files changed, 156 insertions(+), 51 deletions(-) diff --git a/breaker.lua b/breaker.lua index 5a0ae86..b048964 100644 --- a/breaker.lua +++ b/breaker.lua @@ -253,8 +253,13 @@ end local function break_node (pos, range) local node = minetest.get_node_or_nil (pos) + local meta = minetest.get_meta (pos) if node then + if meta and minetest.is_protected (pos, meta:get_string ("owner")) then + return + end + local breakpos = get_break_pos (pos, node.param2, range) if breakpos then diff --git a/change.log b/change.log index d84548d..7109ba6 100644 --- a/change.log +++ b/change.log @@ -175,3 +175,8 @@ v0.1.28 v0.1.29 * Fixed piston moving piston blanks. + + +v0.1.30 +* Added quantity field to droppers. +* Added 'Use player when placing' setting. diff --git a/deployer.lua b/deployer.lua index 63079b0..25ff964 100644 --- a/deployer.lua +++ b/deployer.lua @@ -73,13 +73,18 @@ end -local function place_node (item, pos) +local function place_node (item, pos, owner) local node = minetest.get_node_or_nil ({ x = pos.x, y = pos.y - 1, z = pos.z }) if not node then return false end + if (utils.settings.use_player_when_placing and minetest.is_protected (pos, owner)) or + (not utils.settings.use_player_when_placing and minetest.is_protected (pos, "")) then + return false + end + local nodedef = utils.find_item_def (node.name) if node.name == "air" or not nodedef or (nodedef and nodedef.buildable_to) then @@ -95,7 +100,7 @@ local function place_node (item, pos) nodedef = utils.find_item_def (node.name) if node.name ~= "air" then - if not nodedef or not nodedef.buildable_to or minetest.is_protected (pos, "") then + if not nodedef or not nodedef.buildable_to then return false end end @@ -121,8 +126,14 @@ local function place_node (item, pos) } end + local placer + + if owner ~= "" and utils.settings.use_player_when_placing then + placer = minetest.get_player_by_name (owner) + end + if itemdef and itemdef.on_place then - local result, leftover = pcall (itemdef.on_place, stack, nil, pointed_thing) + local result, leftover = pcall (itemdef.on_place, stack, placer, pointed_thing) placed = result @@ -221,7 +232,7 @@ local function deploy_item (pos, node, slot, range) local deploypos = get_deploy_pos (pos, node.param2, range) if item and deploypos then - if place_node (stack, deploypos) then + if place_node (stack, deploypos, meta:get_string ("owner")) then stack:set_count (stack:get_count () - 1) inv:set_stack ("main", slot, stack) diff --git a/dropper.lua b/dropper.lua index 0e55d12..8a934cc 100644 --- a/dropper.lua +++ b/dropper.lua @@ -23,7 +23,7 @@ end -local function send_drop_message (pos, slot, name) +local function send_drop_message (pos, slot, name, qty) if utils.digilines_supported then local meta = minetest.get_meta (pos) @@ -36,7 +36,8 @@ local function send_drop_message (pos, slot, name) channel, { action = "drop", name = name, - slot = slot }) + slot = slot, + qty = qty }) end end end @@ -45,69 +46,110 @@ end -- slot: --- nil - next item, no drop if empty --- number - 1 item from slot, no drop if empty --- string - name of item to drop, no drop if none -local function drop_item (pos, node, slot) +-- nil or "nil"- next item, no drop if empty, max qty or less of first found item +-- number - qty items from slot, no drop if empty, max qty or less +-- string - name of item to drop, no drop if none, max qty or less +local function drop_item (pos, node, slot, qty) local meta = minetest.get_meta (pos) if meta then local inv = meta:get_inventory () if inv then - if not slot then + local item + + if qty then + qty = tonumber (qty) + end + + if not qty then + qty = tonumber (meta:get_string ("quantity")) or 1 + end + + qty = math.max (qty, 1) + + if not slot or (type (slot) == "string" and slot == "nil") then local slots = inv:get_size ("main") for i = 1, slots do local stack = inv:get_stack ("main", i) if not stack:is_empty () and stack:get_count () > 0 then - slot = i + item = stack:get_name () break end end - elseif type (slot) == "string" then - local name = slot slot = nil - local slots = inv:get_size ("main") - - for i = 1, slots do - local stack = inv:get_stack ("main", i) - - if not stack:is_empty () and stack:get_count () > 0 then - if name == stack:get_name () then - slot = i - break - end - end - end + elseif type (slot) == "string" then + item = slot + slot = nil else slot = tonumber (slot) - end if slot then local stack = inv:get_stack ("main", slot) if not stack:is_empty () and stack:get_count () > 0 then - local name = stack:get_name () - local item = ItemStack (stack) + item = stack:get_name () + local drop - if item then - item:set_count (1) - - stack:set_count (stack:get_count () - 1) + if stack:get_count () >= qty then + drop = qty + stack:set_count (stack:get_count () - qty) inv:set_stack ("main", slot, stack) - - utils.item_drop (item, nil, drop_pos (pos, node)) - - send_drop_message (pos, slot, name) - - return true, slot, name + else + drop = stack:get_count () + inv:set_stack ("main", slot, nil) end + + if drop > 0 then + utils.item_drop (ItemStack (item.." "..drop), nil, drop_pos (pos, node)) + + send_drop_message (pos, slot, item, drop) + + return true, slot, item + end + end + + elseif item then + local slots = inv:get_size ("main") + local drop = 0 + + for i = 1, slots do + local stack = inv:get_stack ("main", i) + + if not stack:is_empty () and stack:get_count () > 0 then + if item == stack:get_name () then + local remain = qty - drop + + slot = (slot and -1) or i + + if stack:get_count () > remain then + stack:set_count (stack:get_count () - remain) + drop = qty + inv:set_stack ("main", i, stack) + else + drop = drop + stack:get_count () + inv:set_stack ("main", i, nil) + end + end + end + + if drop == qty then + break + end + end + + if drop > 0 then + utils.item_drop (ItemStack (item.." "..drop), nil, drop_pos (pos, node)) + + send_drop_message (pos, slot, item, drop) + + return true, slot, item end end end @@ -118,19 +160,27 @@ end -local function after_place_base (pos, placer, itemstack, pointed_thing) - local meta = minetest.get_meta (pos) - local spec = +local function get_formspec () + return "formspec_version[3]\n".. "size[11.75,13.75;true]\n".. - "field[1.0,1.0;4.0,0.8;channel;Channel;${channel}]\n".. - "button[5.5,1.0;2.0,0.8;setchannel;Set]\n".. - "list[context;main;3.5,2.5;4,4;]\n".. - "list[current_player;main;1.0,8.0;8,4;]\n".. - "listring[]" + "field[1.0,1.0;4.0,0.8;channel;Channel;${channel}]".. + "button[5.5,1.0;2.0,0.8;setchannel;Set]".. + "list[context;main;1.0,2.5;4,4;]".. + "list[current_player;main;1.0,8.0;8,4;]".. + "listring[]".. + "field[6.5,2.9;2.75,0.8;quantity;Qty;${quantity}]".. + "button[9.25,2.9;1.5,0.8;setquantity;Set]" +end + + + +local function after_place_base (pos, placer, itemstack, pointed_thing) + local meta = minetest.get_meta (pos) meta:set_string ("inventory", "{ main = { } }") - meta:set_string ("formspec", spec) + meta:set_string ("quantity", "1") + meta:set_string ("formspec", get_formspec ()) local inv = meta:get_inventory () @@ -180,6 +230,15 @@ local function on_receive_fields (pos, formname, fields, sender) meta:set_string ("channel", fields.channel) end end + + if fields.setquantity then + local meta = minetest.get_meta (pos) + + if meta then + local qty = math.max (tonumber (fields.quantity or 1) or 1, 1) + meta:set_string ("quantity", tostring (qty)) + end + end end @@ -285,6 +344,15 @@ local function on_rightclick (pos, node, clicker, itemstack, pointed_thing) "lwcomponents:component_privately_owned", spec) end + else + local meta = minetest.get_meta (pos) + + if meta then + if meta:get_string ("quantity") == "" then + meta:set_string ("quantity", "1") + meta:set_string ("formspec", get_formspec ()) + end + end end return itemstack @@ -322,7 +390,13 @@ local function digilines_support () m[2] = tonumber (m[2]) end - drop_item (pos, node, m[2]) + if m[3] and tonumber (m[3]) then + m[3] = tonumber (m[3]) + else + m[3] = nil + end + + drop_item (pos, node, m[2], m[3]) end end end diff --git a/init.lua b/init.lua index 9dcc73d..9c5cb20 100644 --- a/init.lua +++ b/init.lua @@ -1,4 +1,4 @@ -local version = "0.1.29" +local version = "0.1.30" local mod_storage = minetest.get_mod_storage () diff --git a/readme.txt b/readme.txt index 3f071e3..02cca7a 100644 --- a/readme.txt +++ b/readme.txt @@ -13,7 +13,7 @@ CC BY-SA 3.0 Version ======= -0.1.29 +0.1.30 Minetest Version @@ -105,5 +105,9 @@ Maximum piston nodes Maximum nodes a piston can push. Default: 15 +Use player when placing + Use the owner player of locked versions when placing nodes, otherwise + no player is used. + Default: false ------------------------------------------------------------------------ diff --git a/settings.lua b/settings.lua index 7cd11f3..4c6c099 100644 --- a/settings.lua +++ b/settings.lua @@ -12,6 +12,9 @@ utils.settings.alert_handler_errors = utils.settings.max_piston_nodes = tonumber (minetest.settings:get ("lwcomponents_max_piston_nodes") or 15) +utils.settings.use_player_when_placing = + minetest.settings:get_bool ("lwcomponents_use_player_when_placing", false) + utils.settings.default_stack_max = tonumber (minetest.settings:get ("default_stack_max")) or 99 diff --git a/settingtypes.txt b/settingtypes.txt index 3251c7d..4fe5275 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -6,3 +6,6 @@ lwcomponents_alert_handler_errors (Alert handler errors) bool true # Maximum nodes a piston can push. lwcomponents_max_piston_nodes (Maximum piston nodes) int 15 + +# Use owner player when placing nodes. +lwcomponents_use_player_when_placing (Use player when placing) bool false