From 2d42301d85a55dcae357a45cdb1f917fda2d8c71 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Mon, 26 Jun 2017 15:15:48 +0200 Subject: [PATCH 01/83] Replace deprecated calls --- init.lua | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/init.lua b/init.lua index e4bce00..a5789a2 100644 --- a/init.lua +++ b/init.lua @@ -1,11 +1,11 @@ minetest.register_globalstep(function(dtime) for _,player in ipairs(minetest.get_connected_players()) do - if player:get_hp() > 0 or not minetest.setting_getbool("enable_damage") then + if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then local pos = player:getpos() pos.y = pos.y+0.5 local inv = player:get_inventory() - - for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 1)) do + + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) @@ -20,8 +20,8 @@ minetest.register_globalstep(function(dtime) end end end - - for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 2)) do + + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 2)) do if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then if object:get_luaentity().collect then if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then @@ -37,7 +37,7 @@ minetest.register_globalstep(function(dtime) object:get_luaentity().object:set_properties({ physical = false }) - + minetest.after(1, function(args) local lua = object:get_luaentity() if object == nil or lua == nil or lua.itemstring == nil then @@ -61,7 +61,7 @@ minetest.register_globalstep(function(dtime) }) end end, {player, object}) - + end end end @@ -72,7 +72,7 @@ end) function minetest.handle_node_drops(pos, drops, digger) local inv - if minetest.setting_getbool("creative_mode") and digger and digger:is_player() then + if minetest.settings:get_bool("creative_mode") and digger and digger:is_player() then inv = digger:get_inventory() end for _,item in ipairs(drops) do @@ -86,7 +86,7 @@ function minetest.handle_node_drops(pos, drops, digger) end if not inv or not inv:contains_item("main", ItemStack(name)) then for i=1,count do - local obj = minetest.env:add_item(pos, name) + local obj = minetest.add_item(pos, name) if obj ~= nil then obj:get_luaentity().collect = true local x = math.random(1, 5) @@ -98,10 +98,10 @@ function minetest.handle_node_drops(pos, drops, digger) z = -z end obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) - + -- FIXME this doesnt work for deactiveted objects - if minetest.setting_get("remove_items") and tonumber(minetest.setting_get("remove_items")) then - minetest.after(tonumber(minetest.setting_get("remove_items")), function(obj) + if minetest.settings:get("remove_items") and tonumber(minetest.settings:get("remove_items")) then + minetest.after(tonumber(minetest.settings:get("remove_items")), function(obj) obj:remove() end, obj) end @@ -111,6 +111,6 @@ function minetest.handle_node_drops(pos, drops, digger) end end -if minetest.setting_get("log_mods") then +if minetest.settings:get("log_mods") then minetest.log("action", "item_drop loaded") end From 04f75caeb3a4c6c817ced3f96807861a5c309f55 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Mon, 26 Jun 2017 15:24:56 +0200 Subject: [PATCH 02/83] Add settings for pickups and drops --- init.lua | 181 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 94 insertions(+), 87 deletions(-) diff --git a/init.lua b/init.lua index a5789a2..5bd1ad3 100644 --- a/init.lua +++ b/init.lua @@ -1,67 +1,72 @@ -minetest.register_globalstep(function(dtime) - for _,player in ipairs(minetest.get_connected_players()) do - if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then - local pos = player:getpos() - pos.y = pos.y+0.5 - local inv = player:get_inventory() +local enable_item_pickup = minetest.settings:get_bool("enable_item_pickup") or true +local enable_item_drops = minetest.settings:get_bool("enable_item_drops") or true - for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then - if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = 0.4, - }) +if enable_item_pickup then + minetest.register_globalstep(function(dtime) + for _,player in ipairs(minetest.get_connected_players()) do + if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then + local pos = player:getpos() + pos.y = pos.y+0.5 + local inv = player:get_inventory() + + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = 0.4, + }) + end + object:get_luaentity().itemstring = "" + object:remove() end - object:get_luaentity().itemstring = "" - object:remove() end end - end - for _,object in ipairs(minetest.get_objects_inside_radius(pos, 2)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then - if object:get_luaentity().collect then - if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - local pos1 = pos - pos1.y = pos1.y+0.2 - local pos2 = object:getpos() - local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} - vec.x = vec.x*3 - vec.y = vec.y*3 - vec.z = vec.z*3 - object:setvelocity(vec) - object:get_luaentity().physical_state = false - object:get_luaentity().object:set_properties({ - physical = false - }) + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 2)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if object:get_luaentity().collect then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + local pos1 = pos + pos1.y = pos1.y+0.2 + local pos2 = object:getpos() + local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} + vec.x = vec.x*3 + vec.y = vec.y*3 + vec.z = vec.z*3 + object:setvelocity(vec) + object:get_luaentity().physical_state = false + object:get_luaentity().object:set_properties({ + physical = false + }) - minetest.after(1, function(args) - local lua = object:get_luaentity() - if object == nil or lua == nil or lua.itemstring == nil then - return - end - if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = 0.4, + minetest.after(1, function(args) + local lua = object:get_luaentity() + if object == nil or lua == nil or lua.itemstring == nil then + return + end + if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = 0.4, + }) + end + object:get_luaentity().itemstring = "" + object:remove() + else + object:setvelocity({x=0,y=0,z=0}) + object:get_luaentity().physical_state = true + object:get_luaentity().object:set_properties({ + physical = true }) end - object:get_luaentity().itemstring = "" - object:remove() - else - object:setvelocity({x=0,y=0,z=0}) - object:get_luaentity().physical_state = true - object:get_luaentity().object:set_properties({ - physical = true - }) - end - end, {player, object}) + end, {player, object}) + end end end end @@ -70,40 +75,42 @@ minetest.register_globalstep(function(dtime) end end) -function minetest.handle_node_drops(pos, drops, digger) - local inv - if minetest.settings:get_bool("creative_mode") and digger and digger:is_player() then - inv = digger:get_inventory() - end - for _,item in ipairs(drops) do - local count, name - if type(item) == "string" then - count = 1 - name = item - else - count = item:get_count() - name = item:get_name() +if enable_item_drops then + function minetest.handle_node_drops(pos, drops, digger) + local inv + if minetest.settings:get_bool("creative_mode") and digger and digger:is_player() then + inv = digger:get_inventory() end - if not inv or not inv:contains_item("main", ItemStack(name)) then - for i=1,count do - local obj = minetest.add_item(pos, name) - if obj ~= nil then - obj:get_luaentity().collect = true - local x = math.random(1, 5) - if math.random(1,2) == 1 then - x = -x - end - local z = math.random(1, 5) - if math.random(1,2) == 1 then - z = -z - end - obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) + for _,item in ipairs(drops) do + local count, name + if type(item) == "string" then + count = 1 + name = item + else + count = item:get_count() + name = item:get_name() + end + if not inv or not inv:contains_item("main", ItemStack(name)) then + for i=1,count do + local obj = minetest.add_item(pos, name) + if obj ~= nil then + obj:get_luaentity().collect = true + local x = math.random(1, 5) + if math.random(1,2) == 1 then + x = -x + end + local z = math.random(1, 5) + if math.random(1,2) == 1 then + z = -z + end + obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) - -- FIXME this doesnt work for deactiveted objects - if minetest.settings:get("remove_items") and tonumber(minetest.settings:get("remove_items")) then - minetest.after(tonumber(minetest.settings:get("remove_items")), function(obj) - obj:remove() - end, obj) + -- FIXME this doesnt work for deactiveted objects + if minetest.settings:get("remove_items") and tonumber(minetest.settings:get("remove_items")) then + minetest.after(tonumber(minetest.settings:get("remove_items")), function(obj) + obj:remove() + end, obj) + end end end end From a523b5a5748344c2eccf92bccc869a69ce82bf34 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Mon, 26 Jun 2017 15:57:23 +0200 Subject: [PATCH 03/83] Add optional pickup key, either sneak, use or a+d key. Add settable sound gain. --- init.lua | 124 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 69 insertions(+), 55 deletions(-) diff --git a/init.lua b/init.lua index 5bd1ad3..04abc54 100644 --- a/init.lua +++ b/init.lua @@ -1,79 +1,93 @@ local enable_item_pickup = minetest.settings:get_bool("enable_item_pickup") or true local enable_item_drops = minetest.settings:get_bool("enable_item_drops") or true +local item_pickup_key = minetest.settings:get_bool("item_pickup_key") or false +local item_pickup_keytype = minetest.settings:get("item_pickup_keytype") or "use" +local item_pickup_gain = tonumber(minetest.settings:get("item_pickup_gain")) or 0.4 + +local item_pickup_key_press = false if enable_item_pickup then minetest.register_globalstep(function(dtime) for _,player in ipairs(minetest.get_connected_players()) do - if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then - local pos = player:getpos() - pos.y = pos.y+0.5 - local inv = player:get_inventory() + if item_pickup_keytype == "sneak" then + item_pickup_key_press = player:get_player_control().sneak + elseif item_pickup_keytype == "ad" then + item_pickup_key_press = player:get_player_control().left and player:get_player_control().right + else + item_pickup_key_press = player:get_player_control().aux1 + end + if item_pickup_key_press or not item_pickup_key then + if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then + local pos = player:getpos() + pos.y = pos.y+0.5 + local inv = player:get_inventory() - for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then - if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = 0.4, - }) + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = item_pickup_gain, + }) + end + object:get_luaentity().itemstring = "" + object:remove() end - object:get_luaentity().itemstring = "" - object:remove() end end - end - for _,object in ipairs(minetest.get_objects_inside_radius(pos, 2)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then - if object:get_luaentity().collect then - if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - local pos1 = pos - pos1.y = pos1.y+0.2 - local pos2 = object:getpos() - local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} - vec.x = vec.x*3 - vec.y = vec.y*3 - vec.z = vec.z*3 - object:setvelocity(vec) - object:get_luaentity().physical_state = false - object:get_luaentity().object:set_properties({ - physical = false - }) + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 2)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if object:get_luaentity().collect then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + local pos1 = pos + pos1.y = pos1.y+0.2 + local pos2 = object:getpos() + local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} + vec.x = vec.x*3 + vec.y = vec.y*3 + vec.z = vec.z*3 + object:setvelocity(vec) + object:get_luaentity().physical_state = false + object:get_luaentity().object:set_properties({ + physical = false + }) - minetest.after(1, function(args) - local lua = object:get_luaentity() - if object == nil or lua == nil or lua.itemstring == nil then - return - end - if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = 0.4, + minetest.after(1, function(args) + local lua = object:get_luaentity() + if object == nil or lua == nil or lua.itemstring == nil then + return + end + if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = item_pickup_gain, + }) + end + object:get_luaentity().itemstring = "" + object:remove() + else + object:setvelocity({x=0,y=0,z=0}) + object:get_luaentity().physical_state = true + object:get_luaentity().object:set_properties({ + physical = true }) end - object:get_luaentity().itemstring = "" - object:remove() - else - object:setvelocity({x=0,y=0,z=0}) - object:get_luaentity().physical_state = true - object:get_luaentity().object:set_properties({ - physical = true - }) - end - end, {player, object}) + end, {player, object}) + end end end end end end end - end -end) + end) +end if enable_item_drops then function minetest.handle_node_drops(pos, drops, digger) From 7f38ae52618360e9aeab8b4f97c31b1ad33df243 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Sun, 9 Jul 2017 16:12:57 +0200 Subject: [PATCH 04/83] Fix global settings bool fallbacks --- init.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/init.lua b/init.lua index 04abc54..eb59cf5 100644 --- a/init.lua +++ b/init.lua @@ -1,6 +1,9 @@ -local enable_item_pickup = minetest.settings:get_bool("enable_item_pickup") or true -local enable_item_drops = minetest.settings:get_bool("enable_item_drops") or true -local item_pickup_key = minetest.settings:get_bool("item_pickup_key") or false +local enable_item_pickup = minetest.settings:get_bool("enable_item_pickup") +if enable_item_pickup == nil then enable_item_pickup = true end +local enable_item_drops = minetest.settings:get_bool("enable_item_drops") +if enable_item_drops == nil then enable_item_drops = true end +local item_pickup_key = minetest.settings:get_bool("item_pickup_key") +if item_pickup_key == nil then item_pickup_key = true end local item_pickup_keytype = minetest.settings:get("item_pickup_keytype") or "use" local item_pickup_gain = tonumber(minetest.settings:get("item_pickup_gain")) or 0.4 From 67025939e718c275a68c4ccb3eae2982dfd8a053 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Sun, 9 Jul 2017 16:25:11 +0200 Subject: [PATCH 05/83] Remove remove_items, superseded by item_entity_ttl --- init.lua | 7 ------- 1 file changed, 7 deletions(-) diff --git a/init.lua b/init.lua index eb59cf5..140d36e 100644 --- a/init.lua +++ b/init.lua @@ -121,13 +121,6 @@ if enable_item_drops then z = -z end obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) - - -- FIXME this doesnt work for deactiveted objects - if minetest.settings:get("remove_items") and tonumber(minetest.settings:get("remove_items")) then - minetest.after(tonumber(minetest.settings:get("remove_items")), function(obj) - obj:remove() - end, obj) - end end end end From dbb43c2ed136bb8d221ff428139322e0484d06f2 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Sun, 9 Jul 2017 17:33:22 +0200 Subject: [PATCH 06/83] Proper global settingtypes --- init.lua | 39 ++++++++++++++++++++------------------- settingtypes.txt | 14 ++++++++++++++ 2 files changed, 34 insertions(+), 19 deletions(-) create mode 100644 settingtypes.txt diff --git a/init.lua b/init.lua index 140d36e..2c23512 100644 --- a/init.lua +++ b/init.lua @@ -1,25 +1,26 @@ -local enable_item_pickup = minetest.settings:get_bool("enable_item_pickup") -if enable_item_pickup == nil then enable_item_pickup = true end -local enable_item_drops = minetest.settings:get_bool("enable_item_drops") -if enable_item_drops == nil then enable_item_drops = true end -local item_pickup_key = minetest.settings:get_bool("item_pickup_key") -if item_pickup_key == nil then item_pickup_key = true end -local item_pickup_keytype = minetest.settings:get("item_pickup_keytype") or "use" -local item_pickup_gain = tonumber(minetest.settings:get("item_pickup_gain")) or 0.4 +local pickup = minetest.settings:get_bool("enable_item_pickup") +local drops = minetest.settings:get_bool("enable_item_drops") +local key = minetest.settings:get_bool("enable_item_pickup_key") +local keytype = minetest.settings:get("item_pickup_keytype") or "Use" +local gain = tonumber(minetest.settings:get("item_pickup_gain")) or 0.4 -local item_pickup_key_press = false +if pickup == nil then pickup = true end +if drops == nil then drops = true end +if key == nil then key = true end -if enable_item_pickup then +local key_press = false + +if pickup then minetest.register_globalstep(function(dtime) for _,player in ipairs(minetest.get_connected_players()) do - if item_pickup_keytype == "sneak" then - item_pickup_key_press = player:get_player_control().sneak - elseif item_pickup_keytype == "ad" then - item_pickup_key_press = player:get_player_control().left and player:get_player_control().right + if keytype == "Sneak" then + key_press = player:get_player_control().sneak + elseif keytype == "LeftAndRight" then + key_press = player:get_player_control().left and player:get_player_control().right else - item_pickup_key_press = player:get_player_control().aux1 + key_press = player:get_player_control().aux1 end - if item_pickup_key_press or not item_pickup_key then + if key_press or not key then if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then local pos = player:getpos() pos.y = pos.y+0.5 @@ -32,7 +33,7 @@ if enable_item_pickup then if object:get_luaentity().itemstring ~= "" then minetest.sound_play("item_drop_pickup", { to_player = player:get_player_name(), - gain = item_pickup_gain, + gain = gain, }) end object:get_luaentity().itemstring = "" @@ -68,7 +69,7 @@ if enable_item_pickup then if object:get_luaentity().itemstring ~= "" then minetest.sound_play("item_drop_pickup", { to_player = player:get_player_name(), - gain = item_pickup_gain, + gain = gain, }) end object:get_luaentity().itemstring = "" @@ -92,7 +93,7 @@ if enable_item_pickup then end) end -if enable_item_drops then +if drops then function minetest.handle_node_drops(pos, drops, digger) local inv if minetest.settings:get_bool("creative_mode") and digger and digger:is_player() then diff --git a/settingtypes.txt b/settingtypes.txt new file mode 100644 index 0000000..9b05823 --- /dev/null +++ b/settingtypes.txt @@ -0,0 +1,14 @@ +#Pick up items automatically +enable_item_pickup (Enable item pickups) bool true + +#Drop items in-world on dig +enable_item_drops (Enable item drops) bool true + +#Use a key to pick up items +enable_item_pickup_key (Use pickup key) bool true + +#What keytype to use as pickup key +item_pickup_keytype (Pickup keytype) enum Use Use,Sneak,LeftAndRight + +#The volume of the pickup sound +item_pickup_gain (Pickup sound gain) float 0.4 From a7cdd68cc98b6d2687105675f81db6f6e61ea2dc Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Sun, 9 Jul 2017 18:38:44 +0200 Subject: [PATCH 07/83] Fix var bug --- init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/init.lua b/init.lua index 2c23512..4039869 100644 --- a/init.lua +++ b/init.lua @@ -1,11 +1,11 @@ local pickup = minetest.settings:get_bool("enable_item_pickup") -local drops = minetest.settings:get_bool("enable_item_drops") +local drop = minetest.settings:get_bool("enable_item_drop") local key = minetest.settings:get_bool("enable_item_pickup_key") local keytype = minetest.settings:get("item_pickup_keytype") or "Use" local gain = tonumber(minetest.settings:get("item_pickup_gain")) or 0.4 if pickup == nil then pickup = true end -if drops == nil then drops = true end +if drop == nil then drop = true end if key == nil then key = true end local key_press = false @@ -93,7 +93,7 @@ if pickup then end) end -if drops then +if drop then function minetest.handle_node_drops(pos, drops, digger) local inv if minetest.settings:get_bool("creative_mode") and digger and digger:is_player() then From 1091537584131ef6e1c0ae2140d9820b517cedcd Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Tue, 11 Jul 2017 23:29:18 +0200 Subject: [PATCH 08/83] Use ctrl var --- init.lua | 7 ++++--- settingtypes.txt | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/init.lua b/init.lua index 4039869..077e38c 100644 --- a/init.lua +++ b/init.lua @@ -13,12 +13,13 @@ local key_press = false if pickup then minetest.register_globalstep(function(dtime) for _,player in ipairs(minetest.get_connected_players()) do + local ctrl = player:get_player_control() if keytype == "Sneak" then - key_press = player:get_player_control().sneak + key_press = ctrl.sneak elseif keytype == "LeftAndRight" then - key_press = player:get_player_control().left and player:get_player_control().right + key_press = ctrl.left and ctrl.right else - key_press = player:get_player_control().aux1 + key_press = ctrl.aux1 end if key_press or not key then if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then diff --git a/settingtypes.txt b/settingtypes.txt index 9b05823..39c1cf8 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -2,7 +2,7 @@ enable_item_pickup (Enable item pickups) bool true #Drop items in-world on dig -enable_item_drops (Enable item drops) bool true +enable_item_drop (Enable item drops) bool true #Use a key to pick up items enable_item_pickup_key (Use pickup key) bool true From dbd9538a78f0b1fa7a5943bd83eaddd832889e6a Mon Sep 17 00:00:00 2001 From: LouisCyfer Date: Thu, 3 Aug 2017 22:32:36 +0200 Subject: [PATCH 09/83] Pickup radius, new keytypes, limited globalstep (#1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thank you @LouisCyfer :taco: 🎉 --- init.lua | 76 +++++++++++++++++++++++++++++++----------------- settingtypes.txt | 5 +++- 2 files changed, 53 insertions(+), 28 deletions(-) diff --git a/init.lua b/init.lua index 077e38c..dcc3622 100644 --- a/init.lua +++ b/init.lua @@ -1,40 +1,57 @@ local pickup = minetest.settings:get_bool("enable_item_pickup") local drop = minetest.settings:get_bool("enable_item_drop") local key = minetest.settings:get_bool("enable_item_pickup_key") -local keytype = minetest.settings:get("item_pickup_keytype") or "Use" -local gain = tonumber(minetest.settings:get("item_pickup_gain")) or 0.4 if pickup == nil then pickup = true end if drop == nil then drop = true end if key == nil then key = true end -local key_press = false +local keytype = minetest.settings:get("item_pickup_keytype") or "Use" +local pickup_gain = tonumber(minetest.settings:get("item_pickup_gain")) or 0.4 +local pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) or 0.75 + +local timer = 0 if pickup then minetest.register_globalstep(function(dtime) + + timer = timer + dtime + if timer < 0.2 then return end + timer = 0 + for _,player in ipairs(minetest.get_connected_players()) do - local ctrl = player:get_player_control() - if keytype == "Sneak" then - key_press = ctrl.sneak - elseif keytype == "LeftAndRight" then - key_press = ctrl.left and ctrl.right - else - key_press = ctrl.aux1 + local keys_pressed = false + + local control = player:get_player_control() + + if keytype == "Use" then + if control.aux1 == true then keys_pressed = true end + elseif keytype == "Sneak" then + if control.sneak == true then keys_pressed = true end + elseif keytype == "LeftAndRight" then -- LeftAndRight combination + if control.left and control.right then keys_pressed = true end + elseif keytype == "RMB" then + if control.RMB == true then keys_pressed = true end + elseif keytype == "SneakAndRMB" then -- SneakAndRMB combination + if control.sneak and control.RMB then keys_pressed = true end end - if key_press or not key then + + if keys_pressed or not key then + if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then local pos = player:getpos() pos.y = pos.y+0.5 local inv = player:get_inventory() - for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do + for _,object in ipairs(minetest.get_objects_inside_radius(pos, pickup_radius)) do if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) if object:get_luaentity().itemstring ~= "" then + --minetest.chat_send_player(player:get_player_name(), "[ItemPickup] You picked up " .. object:get_luaentity().itemstring) minetest.sound_play("item_drop_pickup", { to_player = player:get_player_name(), - gain = gain, + gain = pickup_gain, }) end object:get_luaentity().itemstring = "" @@ -62,15 +79,14 @@ if pickup then minetest.after(1, function(args) local lua = object:get_luaentity() - if object == nil or lua == nil or lua.itemstring == nil then - return - end + if object == nil or lua == nil or lua.itemstring == nil then return end + if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) if object:get_luaentity().itemstring ~= "" then minetest.sound_play("item_drop_pickup", { to_player = player:get_player_name(), - gain = gain, + gain = pickup_gain, }) end object:get_luaentity().itemstring = "" @@ -82,6 +98,7 @@ if pickup then physical = true }) end + end, {player, object}) end @@ -96,10 +113,15 @@ end if drop then function minetest.handle_node_drops(pos, drops, digger) + local inv + local diggerPos = pos + if minetest.settings:get_bool("creative_mode") and digger and digger:is_player() then inv = digger:get_inventory() + diggerPos = digger:getpos() end + for _,item in ipairs(drops) do local count, name if type(item) == "string" then @@ -109,19 +131,21 @@ if drop then count = item:get_count() name = item:get_name() end + if not inv or not inv:contains_item("main", ItemStack(name)) then for i=1,count do - local obj = minetest.add_item(pos, name) + + local adjustedPos = {x=diggerPos.x, y=diggerPos.y, z=diggerPos.z} + local obj = minetest.add_item(adjustedPos, name) + if obj ~= nil then obj:get_luaentity().collect = true local x = math.random(1, 5) - if math.random(1,2) == 1 then - x = -x - end + if math.random(1,2) == 1 then x = -x end + local z = math.random(1, 5) - if math.random(1,2) == 1 then - z = -z - end + if math.random(1,2) == 1 then z = -z end + obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) end end @@ -130,6 +154,4 @@ if drop then end end -if minetest.settings:get("log_mods") then - minetest.log("action", "item_drop loaded") -end +if minetest.settings:get("log_mods") then minetest.log("action", "[Mod] item_drop loaded") end diff --git a/settingtypes.txt b/settingtypes.txt index 39c1cf8..ad5b4cb 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -8,7 +8,10 @@ enable_item_drop (Enable item drops) bool true enable_item_pickup_key (Use pickup key) bool true #What keytype to use as pickup key -item_pickup_keytype (Pickup keytype) enum Use Use,Sneak,LeftAndRight +item_pickup_keytype (Pickup keytype) enum Use Use,Sneak,LeftAndRight,RMB,SneakAndRMB #The volume of the pickup sound item_pickup_gain (Pickup sound gain) float 0.4 + +#Player pickup radius +item_pickup_radius (Pickup radius) float 0.75 From 5aed10c3e7db9b57b228f2e729cbff707ba0560e Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Wed, 30 Aug 2017 21:13:33 +0200 Subject: [PATCH 10/83] Code touch-up --- init.lua | 241 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 121 insertions(+), 120 deletions(-) diff --git a/init.lua b/init.lua index dcc3622..7b6310d 100644 --- a/init.lua +++ b/init.lua @@ -13,145 +13,146 @@ local pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) or 0 local timer = 0 if pickup then - minetest.register_globalstep(function(dtime) + minetest.register_globalstep(function(dtime) - timer = timer + dtime - if timer < 0.2 then return end - timer = 0 + timer = timer + dtime + if timer < 0.2 then return end + timer = 0 - for _,player in ipairs(minetest.get_connected_players()) do - local keys_pressed = false + for _,player in ipairs(minetest.get_connected_players()) do + local keys_pressed = false - local control = player:get_player_control() + local control = player:get_player_control() - if keytype == "Use" then - if control.aux1 == true then keys_pressed = true end - elseif keytype == "Sneak" then - if control.sneak == true then keys_pressed = true end - elseif keytype == "LeftAndRight" then -- LeftAndRight combination - if control.left and control.right then keys_pressed = true end - elseif keytype == "RMB" then - if control.RMB == true then keys_pressed = true end - elseif keytype == "SneakAndRMB" then -- SneakAndRMB combination - if control.sneak and control.RMB then keys_pressed = true end - end + if keytype == "Use" then + if control.aux1 == true then keys_pressed = true end + elseif keytype == "Sneak" then + if control.sneak == true then keys_pressed = true end + elseif keytype == "LeftAndRight" then -- LeftAndRight combination + if control.left and control.right then keys_pressed = true end + elseif keytype == "RMB" then + if control.RMB == true then keys_pressed = true end + elseif keytype == "SneakAndRMB" then -- SneakAndRMB combination + if control.sneak and control.RMB then keys_pressed = true end + end - if keys_pressed or not key then + if keys_pressed or not key then - if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then - local pos = player:getpos() - pos.y = pos.y+0.5 - local inv = player:get_inventory() + if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then + local pos = player:getpos() + pos.y = pos.y+0.5 + local inv = player:get_inventory() - for _,object in ipairs(minetest.get_objects_inside_radius(pos, pickup_radius)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then - if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then - --minetest.chat_send_player(player:get_player_name(), "[ItemPickup] You picked up " .. object:get_luaentity().itemstring) - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) - end - object:get_luaentity().itemstring = "" - object:remove() - end - end - end + local objectlist = minetest.get_objects_inside_radius(pos, pickup_radius) + for _,object in ipairs(objectlist) do + if not object:is_player() + and object:get_luaentity() + and object:get_luaentity().name == "__builtin:item" then + local pos2 = object:getpos() + local distance = math.sqrt(((pos2.x - pos.x) * (pos2.x - pos.x)) + ((pos2.y - pos.y) * (pos2.y - pos.y)) + + ((pos2.z - pos.z) * (pos2.z - pos.z))) + if distance <= 1 then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = pickup_gain, + }) + end + object:get_luaentity().itemstring = "" + object:remove() + end + else + if object:get_luaentity().collect then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + local pos1 = pos + pos1.y = pos1.y+0.2 + local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} + vec.x = vec.x*3 + vec.y = vec.y*3 + vec.z = vec.z*3 + object:setvelocity(vec) + object:get_luaentity().physical_state = false + object:get_luaentity().object:set_properties({ + physical = false + }) - for _,object in ipairs(minetest.get_objects_inside_radius(pos, 2)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then - if object:get_luaentity().collect then - if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - local pos1 = pos - pos1.y = pos1.y+0.2 - local pos2 = object:getpos() - local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} - vec.x = vec.x*3 - vec.y = vec.y*3 - vec.z = vec.z*3 - object:setvelocity(vec) - object:get_luaentity().physical_state = false - object:get_luaentity().object:set_properties({ - physical = false - }) - - minetest.after(1, function(args) - local lua = object:get_luaentity() - if object == nil or lua == nil or lua.itemstring == nil then return end - - if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) - end - object:get_luaentity().itemstring = "" - object:remove() - else - object:setvelocity({x=0,y=0,z=0}) - object:get_luaentity().physical_state = true - object:get_luaentity().object:set_properties({ - physical = true - }) - end - - end, {player, object}) - - end - end - end - end - end - end - end - end) + minetest.after(1, function() + local lua = object:get_luaentity() + if object == nil or lua == nil or lua.itemstring == nil then + return + end + if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = pickup_gain, + }) + end + object:get_luaentity().itemstring = "" + object:remove() + else + object:setvelocity({x=0,y=0,z=0}) + object:get_luaentity().physical_state = true + object:get_luaentity().object:set_properties({ + physical = true + }) + end + end, {player, object}) + end + end + end + end + end + end + end + end + end) end if drop then - function minetest.handle_node_drops(pos, drops, digger) + function minetest.handle_node_drops(pos, drops, digger) - local inv - local diggerPos = pos + local inv + local diggerPos = pos - if minetest.settings:get_bool("creative_mode") and digger and digger:is_player() then - inv = digger:get_inventory() - diggerPos = digger:getpos() - end + if minetest.settings:get_bool("creative_mode") and digger and digger:is_player() then + inv = digger:get_inventory() + diggerPos = digger:getpos() + end - for _,item in ipairs(drops) do - local count, name - if type(item) == "string" then - count = 1 - name = item - else - count = item:get_count() - name = item:get_name() - end + for _,item in ipairs(drops) do + local count, name + if type(item) == "string" then + count = 1 + name = item + else + count = item:get_count() + name = item:get_name() + end - if not inv or not inv:contains_item("main", ItemStack(name)) then - for i=1,count do + if not inv or not inv:contains_item("main", ItemStack(name)) then + for i=1,count do - local adjustedPos = {x=diggerPos.x, y=diggerPos.y, z=diggerPos.z} - local obj = minetest.add_item(adjustedPos, name) + local adjustedPos = {x=diggerPos.x, y=diggerPos.y, z=diggerPos.z} + local obj = minetest.add_item(adjustedPos, name) - if obj ~= nil then - obj:get_luaentity().collect = true - local x = math.random(1, 5) - if math.random(1,2) == 1 then x = -x end + if obj ~= nil then + obj:get_luaentity().collect = true + local x = math.random(1, 5) + if math.random(1,2) == 1 then x = -x end - local z = math.random(1, 5) - if math.random(1,2) == 1 then z = -z end + local z = math.random(1, 5) + if math.random(1,2) == 1 then z = -z end - obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) - end - end - end - end - end + obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) + end + end + end + end + end end if minetest.settings:get("log_mods") then minetest.log("action", "[Mod] item_drop loaded") end From c63a4ee2a3efa4458e49b943467b225657861faa Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Thu, 31 Aug 2017 21:21:15 +0200 Subject: [PATCH 11/83] New readme --- README.md | 33 +++++++++++++++++++++++++++++++++ README.txt | 42 ------------------------------------------ 2 files changed, 33 insertions(+), 42 deletions(-) create mode 100644 README.md delete mode 100644 README.txt diff --git a/README.md b/README.md new file mode 100644 index 0000000..d81a294 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# item_drop +By [PilzAdam](https://github.com/PilzAdam), [texmex](https://github.com/tacotexmex/). + +## Description +This mod adds Minecraft like drop/pick up of items to Minetest. + +## Licensing +LGPLv2.1/CC BY-SA 3.0. + +## Notes +item_drop can be played with Minetest 0.4.16 or above. It was originally developed by [PilzAdam](https://github.com/PilzAdam/item_drop). + +## List of features +- All settings may be configured from within the game itself (Settings tab > Advanced settings > Mods > item_drop) +- Drops nodes as in-world items on dig if `enable_item_drop` is `true`. (true by default) +- Pulls items to the player's inventory if `enable_item_pickup` is `true`. (true by default) It uses a node radius set in `pickup_radius` (default 0.75) +- Plays a sound the items are picked up, with the gain level set it `pickup_gain` (default 0.4) +- Requires a key to be pressed in order to pull items if `enable_item_pickup_key` is `true`. (true by default). The keytypes to choose from by setting `item_pickup_keytype` are: + - Use key (`Use`) + - Sneak key (`Sneak`) + - Left and Right keys combined (`LeftAndRight`) + - Right mouse button (`RMB`) + - Sneak key and right mouse button combined (`SneakAndRMB`) + +## Known issues + +## Bug reports and suggestions +You can report bugs or suggest ideas by [filing an issue](http://github.com/tacotexmex/item_drop/issues/new). + +## Links +* [Download ZIP](https://github.com/tacotexmex/item_drop/archive/master.zip) +* [Source](https://github.com/tacotexmex/item_drop/) +* [Forum thread](https://forum.minetest.net/viewtopic.php?t=16913) diff --git a/README.txt b/README.txt deleted file mode 100644 index fe43054..0000000 --- a/README.txt +++ /dev/null @@ -1,42 +0,0 @@ -===ITEM_DROP MOD for MINETEST-C55=== -by PilzAdam - -Introduction: -This mod adds Minecraft like drop/pick up of items to Minetest. - -How to install: -Unzip the archive an place it in minetest-base-directory/mods/minetest/ -if you have a windows client or a linux run-in-place client. If you have -a linux system-wide instalation place it in ~/.minetest/mods/minetest/. -If you want to install this mod only in one world create the folder -worldmods/ in your worlddirectory. -For further information or help see: -http://wiki.minetest.com/wiki/Installing_Mods - -How to use the mod: -Just install it an everything works. - -For developers: -You dont have to use get_drops() anymore because of changes in the -builtin files of minetest. - -License: -Sourcecode: WTFPL (see below) -Sound: WTFPL (see below) - -See also: -http://minetest.net/ - - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - Version 2, December 2004 - - Copyright (C) 2004 Sam Hocevar - - Everyone is permitted to copy and distribute verbatim or modified - copies of this license document, and changing it is allowed as long - as the name is changed. - - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. You just DO WHAT THE FUCK YOU WANT TO. From 07eb65bb31c3d04c2c3e45b8791fdaab92286230 Mon Sep 17 00:00:00 2001 From: texmex Date: Thu, 31 Aug 2017 21:27:22 +0200 Subject: [PATCH 12/83] Create LICENSE --- LICENSE | 504 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 504 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..19e3071 --- /dev/null +++ b/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +(This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.) + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random + Hacker. + + {signature of Ty Coon}, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! From ad4e83d243f26d8fbb0697821757a88c3913cb16 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Thu, 31 Aug 2017 21:33:28 +0200 Subject: [PATCH 13/83] Add description and conf file --- description.txt | 1 + mod.conf | 1 + 2 files changed, 2 insertions(+) create mode 100644 description.txt create mode 100644 mod.conf diff --git a/description.txt b/description.txt new file mode 100644 index 0000000..4488941 --- /dev/null +++ b/description.txt @@ -0,0 +1 @@ +This mod adds Minecraft like drop/pick up of items to Minetest. diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..7a095b1 --- /dev/null +++ b/mod.conf @@ -0,0 +1 @@ +name = item_drop From a88fa5f1b7e7a5d60483ac47b89187d9911adf47 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Sat, 2 Sep 2017 11:08:15 +0200 Subject: [PATCH 14/83] Short code a bit --- init.lua | 145 +++++++++++++++++++++++++++---------------------------- 1 file changed, 71 insertions(+), 74 deletions(-) diff --git a/init.lua b/init.lua index 7b6310d..66584f9 100644 --- a/init.lua +++ b/init.lua @@ -1,15 +1,12 @@ -local pickup = minetest.settings:get_bool("enable_item_pickup") -local drop = minetest.settings:get_bool("enable_item_drop") -local key = minetest.settings:get_bool("enable_item_pickup_key") - -if pickup == nil then pickup = true end -if drop == nil then drop = true end -if key == nil then key = true end - +local pickup = minetest.settings:get_bool("enable_item_pickup") ~= false +local drop = minetest.settings:get_bool("enable_item_drop") ~= false +local key = minetest.settings:get_bool("enable_item_pickup_key") ~= false local keytype = minetest.settings:get("item_pickup_keytype") or "Use" local pickup_gain = tonumber(minetest.settings:get("item_pickup_gain")) or 0.4 local pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) or 0.75 +local damage_enabled = minetest.settings:get_bool("enable_damage") + local timer = 0 if pickup then @@ -25,84 +22,84 @@ if pickup then local control = player:get_player_control() if keytype == "Use" then - if control.aux1 == true then keys_pressed = true end + keys_pressed = control.aux1 elseif keytype == "Sneak" then - if control.sneak == true then keys_pressed = true end + keys_pressed = control.sneak elseif keytype == "LeftAndRight" then -- LeftAndRight combination - if control.left and control.right then keys_pressed = true end + keys_pressed = control.left and control.right elseif keytype == "RMB" then - if control.RMB == true then keys_pressed = true end + keys_pressed = control.RMB elseif keytype == "SneakAndRMB" then -- SneakAndRMB combination - if control.sneak and control.RMB then keys_pressed = true end + keys_pressed = control.sneak and control.RMB end - if keys_pressed or not key then + if not keys_pressed and key + or (damage_enabled and player:get_hp() <= 0) then + return + end - if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then - local pos = player:getpos() - pos.y = pos.y+0.5 - local inv = player:get_inventory() + local pos = player:getpos() + pos.y = pos.y+0.5 + local inv = player:get_inventory() - local objectlist = minetest.get_objects_inside_radius(pos, pickup_radius) - for _,object in ipairs(objectlist) do - if not object:is_player() - and object:get_luaentity() - and object:get_luaentity().name == "__builtin:item" then - local pos2 = object:getpos() - local distance = math.sqrt(((pos2.x - pos.x) * (pos2.x - pos.x)) + ((pos2.y - pos.y) * (pos2.y - pos.y)) - + ((pos2.z - pos.z) * (pos2.z - pos.z))) - if distance <= 1 then - if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) + local objectlist = minetest.get_objects_inside_radius(pos, pickup_radius) + for _,object in ipairs(objectlist) do + if not object:is_player() + and object:get_luaentity() + and object:get_luaentity().name == "__builtin:item" then + local pos2 = object:getpos() + local distance = math.sqrt(((pos2.x - pos.x) * (pos2.x - pos.x)) + ((pos2.y - pos.y) * (pos2.y - pos.y)) + + ((pos2.z - pos.z) * (pos2.z - pos.z))) + if distance <= 1 then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = pickup_gain, + }) + end + object:get_luaentity().itemstring = "" + object:remove() + end + else + if object:get_luaentity().collect then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + local pos1 = pos + pos1.y = pos1.y+0.2 + local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} + vec.x = vec.x*3 + vec.y = vec.y*3 + vec.z = vec.z*3 + object:setvelocity(vec) + object:get_luaentity().physical_state = false + object:get_luaentity().object:set_properties({ + physical = false + }) + + minetest.after(1, function() + local lua = object:get_luaentity() + if not lua or not lua.itemstring then + return end - object:get_luaentity().itemstring = "" - object:remove() - end - else - if object:get_luaentity().collect then - if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - local pos1 = pos - pos1.y = pos1.y+0.2 - local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} - vec.x = vec.x*3 - vec.y = vec.y*3 - vec.z = vec.z*3 - object:setvelocity(vec) - object:get_luaentity().physical_state = false + if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = pickup_gain, + }) + end + object:get_luaentity().itemstring = "" + object:remove() + else + object:setvelocity({x=0,y=0,z=0}) + object:get_luaentity().physical_state = true object:get_luaentity().object:set_properties({ - physical = false + physical = true }) - - minetest.after(1, function() - local lua = object:get_luaentity() - if object == nil or lua == nil or lua.itemstring == nil then - return - end - if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) - end - object:get_luaentity().itemstring = "" - object:remove() - else - object:setvelocity({x=0,y=0,z=0}) - object:get_luaentity().physical_state = true - object:get_luaentity().object:set_properties({ - physical = true - }) - end - end, {player, object}) end - end + end, {player, object}) end end end From 31e8c9b0ccbb4e50eac9af76577bafa209a5345f Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Wed, 6 Sep 2017 13:27:21 +0200 Subject: [PATCH 15/83] Load settings only if they are used --- init.lua | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/init.lua b/init.lua index 66584f9..9c33f9d 100644 --- a/init.lua +++ b/init.lua @@ -1,15 +1,15 @@ -local pickup = minetest.settings:get_bool("enable_item_pickup") ~= false -local drop = minetest.settings:get_bool("enable_item_drop") ~= false -local key = minetest.settings:get_bool("enable_item_pickup_key") ~= false -local keytype = minetest.settings:get("item_pickup_keytype") or "Use" -local pickup_gain = tonumber(minetest.settings:get("item_pickup_gain")) or 0.4 -local pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) or 0.75 - -local damage_enabled = minetest.settings:get_bool("enable_damage") - local timer = 0 -if pickup then +if minetest.settings:get_bool("enable_item_pickup") ~= false then + local pickup_gain = tonumber(minetest.settings:get("item_pickup_gain")) or 0.4 + local pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) or 0.75 + local key_triggered = minetest.settings:get_bool("enable_item_pickup_key") ~= false + local keytype + if key_triggered then + keytype = minetest.settings:get("item_pickup_keytype") or "Use" + end + local damage_enabled = minetest.settings:get_bool("enable_damage") + minetest.register_globalstep(function(dtime) timer = timer + dtime @@ -17,7 +17,7 @@ if pickup then timer = 0 for _,player in ipairs(minetest.get_connected_players()) do - local keys_pressed = false + local keys_pressed = not key_triggered local control = player:get_player_control() @@ -33,7 +33,7 @@ if pickup then keys_pressed = control.sneak and control.RMB end - if not keys_pressed and key + if not keys_pressed or (damage_enabled and player:get_hp() <= 0) then return end @@ -109,7 +109,7 @@ if pickup then end) end -if drop then +if minetest.settings:get_bool("enable_item_drop") ~= false then function minetest.handle_node_drops(pos, drops, digger) local inv From 04c441768fee284585475047ee9d3e733def908e Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Wed, 6 Sep 2017 13:29:48 +0200 Subject: [PATCH 16/83] Use minetest.after instead of globalstep --- init.lua | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/init.lua b/init.lua index 9c33f9d..72fa873 100644 --- a/init.lua +++ b/init.lua @@ -1,5 +1,3 @@ -local timer = 0 - if minetest.settings:get_bool("enable_item_pickup") ~= false then local pickup_gain = tonumber(minetest.settings:get("item_pickup_gain")) or 0.4 local pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) or 0.75 @@ -10,12 +8,7 @@ if minetest.settings:get_bool("enable_item_pickup") ~= false then end local damage_enabled = minetest.settings:get_bool("enable_damage") - minetest.register_globalstep(function(dtime) - - timer = timer + dtime - if timer < 0.2 then return end - timer = 0 - + local function pickupfunc() for _,player in ipairs(minetest.get_connected_players()) do local keys_pressed = not key_triggered @@ -106,7 +99,13 @@ if minetest.settings:get_bool("enable_item_pickup") ~= false then end end end - end) + end + + local function pickup_step() + pickupfunc() + minetest.after(0.2, pickup_step) + end + minetest.after(3.0, pickup_step) end if minetest.settings:get_bool("enable_item_drop") ~= false then From bfcc14bb4b5d7cd2f9bbefbc89e55ab25b848696 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Wed, 6 Sep 2017 15:51:34 +0200 Subject: [PATCH 17/83] Use tabs for indentation --- init.lua | 285 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 153 insertions(+), 132 deletions(-) diff --git a/init.lua b/init.lua index 72fa873..95a63ec 100644 --- a/init.lua +++ b/init.lua @@ -1,154 +1,175 @@ if minetest.settings:get_bool("enable_item_pickup") ~= false then - local pickup_gain = tonumber(minetest.settings:get("item_pickup_gain")) or 0.4 - local pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) or 0.75 - local key_triggered = minetest.settings:get_bool("enable_item_pickup_key") ~= false - local keytype - if key_triggered then - keytype = minetest.settings:get("item_pickup_keytype") or "Use" - end - local damage_enabled = minetest.settings:get_bool("enable_damage") + local pickup_gain = tonumber(minetest.settings:get("item_pickup_gain")) + or 0.4 + local pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) + or 0.75 + local key_triggered = minetest.settings:get_bool("enable_item_pickup_key") + ~= false + local keytype + if key_triggered then + keytype = minetest.settings:get("item_pickup_keytype") or "Use" + end + local damage_enabled = minetest.settings:get_bool("enable_damage") - local function pickupfunc() - for _,player in ipairs(minetest.get_connected_players()) do - local keys_pressed = not key_triggered + local function pickupfunc() + for _,player in ipairs(minetest.get_connected_players()) do + local keys_pressed = not key_triggered - local control = player:get_player_control() + local control = player:get_player_control() - if keytype == "Use" then - keys_pressed = control.aux1 - elseif keytype == "Sneak" then - keys_pressed = control.sneak - elseif keytype == "LeftAndRight" then -- LeftAndRight combination - keys_pressed = control.left and control.right - elseif keytype == "RMB" then - keys_pressed = control.RMB - elseif keytype == "SneakAndRMB" then -- SneakAndRMB combination - keys_pressed = control.sneak and control.RMB - end + if keytype == "Use" then + keys_pressed = control.aux1 + elseif keytype == "Sneak" then + keys_pressed = control.sneak + elseif keytype == "LeftAndRight" then -- LeftAndRight combination + keys_pressed = control.left and control.right + elseif keytype == "RMB" then + keys_pressed = control.RMB + elseif keytype == "SneakAndRMB" then -- SneakAndRMB combination + keys_pressed = control.sneak and control.RMB + end - if not keys_pressed - or (damage_enabled and player:get_hp() <= 0) then - return - end + if not keys_pressed + or (damage_enabled and player:get_hp() <= 0) then + return + end - local pos = player:getpos() - pos.y = pos.y+0.5 - local inv = player:get_inventory() + local pos = player:getpos() + pos.y = pos.y+0.5 + local inv = player:get_inventory() - local objectlist = minetest.get_objects_inside_radius(pos, pickup_radius) - for _,object in ipairs(objectlist) do - if not object:is_player() - and object:get_luaentity() - and object:get_luaentity().name == "__builtin:item" then - local pos2 = object:getpos() - local distance = math.sqrt(((pos2.x - pos.x) * (pos2.x - pos.x)) + ((pos2.y - pos.y) * (pos2.y - pos.y)) - + ((pos2.z - pos.z) * (pos2.z - pos.z))) - if distance <= 1 then - if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) - end - object:get_luaentity().itemstring = "" - object:remove() - end - else - if object:get_luaentity().collect then - if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - local pos1 = pos - pos1.y = pos1.y+0.2 - local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} - vec.x = vec.x*3 - vec.y = vec.y*3 - vec.z = vec.z*3 - object:setvelocity(vec) - object:get_luaentity().physical_state = false - object:get_luaentity().object:set_properties({ - physical = false - }) + local objectlist = minetest.get_objects_inside_radius(pos, + pickup_radius) + for _,object in ipairs(objectlist) do + if not object:is_player() + and object:get_luaentity() + and object:get_luaentity().name == "__builtin:item" then + local pos2 = object:getpos() + local distance = vector.distance(pos, pos2) + if distance <= 1 then + if inv + and inv:room_for_item("main", + ItemStack(object:get_luaentity().itemstring) + ) then + inv:add_item("main", ItemStack( + object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = pickup_gain, + }) + end + object:get_luaentity().itemstring = "" + object:remove() + end + else + if object:get_luaentity().collect then + if inv + and inv:room_for_item("main", + ItemStack(object:get_luaentity().itemstring) + ) then + local pos1 = pos + pos1.y = pos1.y+0.2 + local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, + z=pos1.z-pos2.z} + vec.x = vec.x*3 + vec.y = vec.y*3 + vec.z = vec.z*3 + object:setvelocity(vec) + object:get_luaentity().physical_state = false + object:get_luaentity().object:set_properties({ + physical = false + }) - minetest.after(1, function() - local lua = object:get_luaentity() - if not lua or not lua.itemstring then - return - end - if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) - end - object:get_luaentity().itemstring = "" - object:remove() - else - object:setvelocity({x=0,y=0,z=0}) - object:get_luaentity().physical_state = true - object:get_luaentity().object:set_properties({ - physical = true - }) - end - end, {player, object}) - end - end - end - end - end - end - end + minetest.after(1, function() + local lua = object:get_luaentity() + if not lua or not lua.itemstring then + return + end + if inv:room_for_item("main", + ItemStack(object:get_luaentity( + ).itemstring) + ) then + inv:add_item("main", + ItemStack(object:get_luaentity( + ).itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = pickup_gain, + }) + end + object:get_luaentity().itemstring = "" + object:remove() + else + object:setvelocity({x=0,y=0,z=0}) + object:get_luaentity().physical_state = true + object:get_luaentity().object:set_properties({ + physical = true + }) + end + end, {player, object}) + end + end + end + end + end + end + end - local function pickup_step() - pickupfunc() - minetest.after(0.2, pickup_step) - end - minetest.after(3.0, pickup_step) + local function pickup_step() + pickupfunc() + minetest.after(0.2, pickup_step) + end + minetest.after(3.0, pickup_step) end if minetest.settings:get_bool("enable_item_drop") ~= false then - function minetest.handle_node_drops(pos, drops, digger) + function minetest.handle_node_drops(pos, drops, digger) - local inv - local diggerPos = pos + local inv + local diggerPos = pos - if minetest.settings:get_bool("creative_mode") and digger and digger:is_player() then - inv = digger:get_inventory() - diggerPos = digger:getpos() - end + if minetest.settings:get_bool("creative_mode") + and digger + and digger:is_player() then + inv = digger:get_inventory() + diggerPos = digger:getpos() + end - for _,item in ipairs(drops) do - local count, name - if type(item) == "string" then - count = 1 - name = item - else - count = item:get_count() - name = item:get_name() - end + for _,item in ipairs(drops) do + local count, name + if type(item) == "string" then + count = 1 + name = item + else + count = item:get_count() + name = item:get_name() + end - if not inv or not inv:contains_item("main", ItemStack(name)) then - for i=1,count do + if not inv or not inv:contains_item("main", ItemStack(name)) then + for i=1,count do - local adjustedPos = {x=diggerPos.x, y=diggerPos.y, z=diggerPos.z} - local obj = minetest.add_item(adjustedPos, name) + local adjustedPos = {x=diggerPos.x, y=diggerPos.y, + z=diggerPos.z} + local obj = minetest.add_item(adjustedPos, name) - if obj ~= nil then - obj:get_luaentity().collect = true - local x = math.random(1, 5) - if math.random(1,2) == 1 then x = -x end + if obj ~= nil then + obj:get_luaentity().collect = true + local x = math.random(1, 5) + if math.random(1,2) == 1 then x = -x end - local z = math.random(1, 5) - if math.random(1,2) == 1 then z = -z end + local z = math.random(1, 5) + if math.random(1,2) == 1 then z = -z end - obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) - end - end - end - end - end + obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) + end + end + end + end + end end -if minetest.settings:get("log_mods") then minetest.log("action", "[Mod] item_drop loaded") end +if minetest.settings:get("log_mods") then + minetest.log("action", "[Mod] item_drop loaded") +end From 0eace77417f1e11b9ea7a65eb9a0b80fbeb41001 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Wed, 6 Sep 2017 15:56:04 +0200 Subject: [PATCH 18/83] Add item_drop. prefix to settings --- init.lua | 18 +++++++++--------- settingtypes.txt | 12 ++++++------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/init.lua b/init.lua index 95a63ec..0bb7e10 100644 --- a/init.lua +++ b/init.lua @@ -1,13 +1,13 @@ -if minetest.settings:get_bool("enable_item_pickup") ~= false then - local pickup_gain = tonumber(minetest.settings:get("item_pickup_gain")) - or 0.4 - local pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) - or 0.75 - local key_triggered = minetest.settings:get_bool("enable_item_pickup_key") - ~= false +if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then + local pickup_gain = tonumber( + minetest.settings:get("item_drop.pickup_sound_gain")) or 0.4 + local pickup_radius = tonumber( + minetest.settings:get("item_drop.pickup_radius")) or 0.75 + local key_triggered = minetest.settings:get_bool( + "item_drop.enable_pickup_key") ~= false local keytype if key_triggered then - keytype = minetest.settings:get("item_pickup_keytype") or "Use" + keytype = minetest.settings:get("item_drop.pickup_keytype") or "Use" end local damage_enabled = minetest.settings:get_bool("enable_damage") @@ -124,7 +124,7 @@ if minetest.settings:get_bool("enable_item_pickup") ~= false then minetest.after(3.0, pickup_step) end -if minetest.settings:get_bool("enable_item_drop") ~= false then +if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false then function minetest.handle_node_drops(pos, drops, digger) local inv diff --git a/settingtypes.txt b/settingtypes.txt index ad5b4cb..6580e29 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -1,17 +1,17 @@ #Pick up items automatically -enable_item_pickup (Enable item pickups) bool true +item_drop.enable_item_pickup (Enable item pickups) bool true #Drop items in-world on dig -enable_item_drop (Enable item drops) bool true +item_drop.enable_item_drop (Enable item drops) bool true #Use a key to pick up items -enable_item_pickup_key (Use pickup key) bool true +item_drop.enable_pickup_key (Use pickup key) bool true #What keytype to use as pickup key -item_pickup_keytype (Pickup keytype) enum Use Use,Sneak,LeftAndRight,RMB,SneakAndRMB +item_drop.pickup_keytype (Pickup keytype) enum Use Use,Sneak,LeftAndRight,RMB,SneakAndRMB #The volume of the pickup sound -item_pickup_gain (Pickup sound gain) float 0.4 +item_drop.pickup_sound_gain (Pickup sound gain) float 0.4 #Player pickup radius -item_pickup_radius (Pickup radius) float 0.75 +item_drop.pickup_radius (Pickup radius) float 0.75 From ac3386a402a7ab6e8bbaf11a0cc4797b2759d45f Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Thu, 7 Sep 2017 20:39:49 +0200 Subject: [PATCH 19/83] Add item pickup age --- init.lua | 148 ++++++++++++++++++++++++++--------------------- settingtypes.txt | 3 + 2 files changed, 84 insertions(+), 67 deletions(-) diff --git a/init.lua b/init.lua index 0bb7e10..9e8f8ca 100644 --- a/init.lua +++ b/init.lua @@ -3,6 +3,8 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then minetest.settings:get("item_drop.pickup_sound_gain")) or 0.4 local pickup_radius = tonumber( minetest.settings:get("item_drop.pickup_radius")) or 0.75 + local pickup_age = tonumber( + minetest.settings:get("item_drop.pickup_age")) or 0.5 local key_triggered = minetest.settings:get_bool( "item_drop.enable_pickup_key") ~= false local keytype @@ -11,6 +13,20 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end local damage_enabled = minetest.settings:get_bool("enable_damage") + -- gets the object's luaentity if it can be collected + local function opt_get_ent(object) + if object:is_player() then + return + end + local ent = object:get_luaentity() + if not ent + or ent.name ~= "__builtin:item" + or (ent.dropped_by and ent.age < pickup_age) then + return + end + return ent + end + local function pickupfunc() for _,player in ipairs(minetest.get_connected_players()) do local keys_pressed = not key_triggered @@ -36,80 +52,78 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local pos = player:getpos() pos.y = pos.y+0.5 - local inv = player:get_inventory() + local inv local objectlist = minetest.get_objects_inside_radius(pos, pickup_radius) - for _,object in ipairs(objectlist) do - if not object:is_player() - and object:get_luaentity() - and object:get_luaentity().name == "__builtin:item" then - local pos2 = object:getpos() - local distance = vector.distance(pos, pos2) - if distance <= 1 then - if inv - and inv:room_for_item("main", - ItemStack(object:get_luaentity().itemstring) - ) then - inv:add_item("main", ItemStack( - object:get_luaentity().itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) - end - object:get_luaentity().itemstring = "" - object:remove() + for i = 1,#objectlist do + local object = objectlist[i] + local ent = opt_get_ent(object) + if ent then + if not inv then + inv = player:get_inventory() + if not inv then + minetest.log("error", "[item_drop] Couldn't " .. + "get inventory") + return end - else - if object:get_luaentity().collect then - if inv - and inv:room_for_item("main", - ItemStack(object:get_luaentity().itemstring) - ) then - local pos1 = pos - pos1.y = pos1.y+0.2 - local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, - z=pos1.z-pos2.z} - vec.x = vec.x*3 - vec.y = vec.y*3 - vec.z = vec.z*3 - object:setvelocity(vec) - object:get_luaentity().physical_state = false - object:get_luaentity().object:set_properties({ - physical = false - }) + end + if inv:room_for_item("main", + ItemStack(ent.itemstring) + ) then + local pos2 = object:getpos() + local distance = vector.distance(pos, pos2) + if distance <= 1 then + inv:add_item("main", ItemStack( + ent.itemstring)) + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = pickup_gain, + }) + ent.itemstring = "" + object:remove() + else + local pos1 = pos + pos1.y = pos1.y+0.2 + local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, + z=pos1.z-pos2.z} + vec.x = vec.x*3 + vec.y = vec.y*3 + vec.z = vec.z*3 + object:setvelocity(vec) + ent.physical_state = false + ent.object:set_properties({ + physical = false + }) - minetest.after(1, function() - local lua = object:get_luaentity() - if not lua or not lua.itemstring then - return - end - if inv:room_for_item("main", + minetest.after(1, function() + local lua = object:get_luaentity() + if not lua or not lua.itemstring then + return + end + if inv:room_for_item("main", + ItemStack(object:get_luaentity( + ).itemstring) + ) then + inv:add_item("main", ItemStack(object:get_luaentity( - ).itemstring) - ) then - inv:add_item("main", - ItemStack(object:get_luaentity( - ).itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) - end - object:get_luaentity().itemstring = "" - object:remove() - else - object:setvelocity({x=0,y=0,z=0}) - object:get_luaentity().physical_state = true - object:get_luaentity().object:set_properties({ - physical = true + ).itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = pickup_gain, }) end - end, {player, object}) - end + object:get_luaentity().itemstring = "" + object:remove() + else + object:setvelocity({x=0,y=0,z=0}) + object:get_luaentity().physical_state = true + object:get_luaentity().object:set_properties({ + physical = true + }) + end + end, {player, object}) end end end @@ -119,7 +133,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local function pickup_step() pickupfunc() - minetest.after(0.2, pickup_step) + minetest.after(0.01, pickup_step) end minetest.after(3.0, pickup_step) end diff --git a/settingtypes.txt b/settingtypes.txt index 6580e29..1ea13da 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -15,3 +15,6 @@ item_drop.pickup_sound_gain (Pickup sound gain) float 0.4 #Player pickup radius item_drop.pickup_radius (Pickup radius) float 0.75 + +#Time delay in seconds after autopicking an item if it's dropped by a player +item_drop.pickup_age (Pickup age) float 0.5 From ce059ad5ad114d248317bd0648417475c215431b Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Thu, 7 Sep 2017 20:44:08 +0200 Subject: [PATCH 20/83] Simplify velocity calculation --- init.lua | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/init.lua b/init.lua index 9e8f8ca..3caa8d3 100644 --- a/init.lua +++ b/init.lua @@ -83,14 +83,10 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then ent.itemstring = "" object:remove() else - local pos1 = pos - pos1.y = pos1.y+0.2 - local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, - z=pos1.z-pos2.z} - vec.x = vec.x*3 - vec.y = vec.y*3 - vec.z = vec.z*3 - object:setvelocity(vec) + local vel = vector.multiply( + vector.subtract(pos, pos2), 3) + vel.y = vel.y + 0.6 + object:setvelocity(vel) ent.physical_state = false ent.object:set_properties({ physical = false From 8c3a470690bef525ce9dc7717ee60ca3735e8500 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Thu, 7 Sep 2017 20:57:02 +0200 Subject: [PATCH 21/83] Move item flight code --- init.lua | 60 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/init.lua b/init.lua index 3caa8d3..fe629e1 100644 --- a/init.lua +++ b/init.lua @@ -21,12 +21,40 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local ent = object:get_luaentity() if not ent or ent.name ~= "__builtin:item" - or (ent.dropped_by and ent.age < pickup_age) then + or (ent.dropped_by and ent.age < pickup_age) + or ent.itemstring == "" then return end return ent end + -- take item or reset velocity after flying a second + local function afterflight(object, inv, player) + local ent = opt_get_ent(object) + if not ent then + return + end + if inv + and inv:room_for_item("main", + ItemStack(ent.itemstring) + ) then + inv:add_item("main", + ItemStack(ent.itemstring)) + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = pickup_gain, + }) + ent.itemstring = "" + object:remove() + else + object:setvelocity({x=0,y=0,z=0}) + ent.physical_state = true + ent.object:set_properties({ + physical = true + }) + end + end + local function pickupfunc() for _,player in ipairs(minetest.get_connected_players()) do local keys_pressed = not key_triggered @@ -92,34 +120,8 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then physical = false }) - minetest.after(1, function() - local lua = object:get_luaentity() - if not lua or not lua.itemstring then - return - end - if inv:room_for_item("main", - ItemStack(object:get_luaentity( - ).itemstring) - ) then - inv:add_item("main", - ItemStack(object:get_luaentity( - ).itemstring)) - if object:get_luaentity().itemstring ~= "" then - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) - end - object:get_luaentity().itemstring = "" - object:remove() - else - object:setvelocity({x=0,y=0,z=0}) - object:get_luaentity().physical_state = true - object:get_luaentity().object:set_properties({ - physical = true - }) - end - end, {player, object}) + minetest.after(1.0, afterflight, + object, inv, player) end end end From f91c73d2e342977b0d1190e7ac0ccd936b9c422c Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Thu, 7 Sep 2017 21:00:55 +0200 Subject: [PATCH 22/83] Fix multiplayer support --- init.lua | 121 +++++++++++++++++++++++++++---------------------------- 1 file changed, 60 insertions(+), 61 deletions(-) diff --git a/init.lua b/init.lua index fe629e1..f4ea02b 100644 --- a/init.lua +++ b/init.lua @@ -55,74 +55,70 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end end - local function pickupfunc() - for _,player in ipairs(minetest.get_connected_players()) do - local keys_pressed = not key_triggered + local function pickupfunc(player) + local keys_pressed = not key_triggered - local control = player:get_player_control() + local control = player:get_player_control() - if keytype == "Use" then - keys_pressed = control.aux1 - elseif keytype == "Sneak" then - keys_pressed = control.sneak - elseif keytype == "LeftAndRight" then -- LeftAndRight combination - keys_pressed = control.left and control.right - elseif keytype == "RMB" then - keys_pressed = control.RMB - elseif keytype == "SneakAndRMB" then -- SneakAndRMB combination - keys_pressed = control.sneak and control.RMB - end + if keytype == "Use" then + keys_pressed = control.aux1 + elseif keytype == "Sneak" then + keys_pressed = control.sneak + elseif keytype == "LeftAndRight" then -- LeftAndRight combination + keys_pressed = control.left and control.right + elseif keytype == "RMB" then + keys_pressed = control.RMB + elseif keytype == "SneakAndRMB" then -- SneakAndRMB combination + keys_pressed = control.sneak and control.RMB + end - if not keys_pressed - or (damage_enabled and player:get_hp() <= 0) then - return - end + if not keys_pressed + or (damage_enabled and player:get_hp() <= 0) then + return + end - local pos = player:getpos() - pos.y = pos.y+0.5 - local inv + local pos = player:getpos() + pos.y = pos.y+0.5 + local inv - local objectlist = minetest.get_objects_inside_radius(pos, - pickup_radius) - for i = 1,#objectlist do - local object = objectlist[i] - local ent = opt_get_ent(object) - if ent then + local objectlist = minetest.get_objects_inside_radius(pos, + pickup_radius) + for i = 1,#objectlist do + local object = objectlist[i] + local ent = opt_get_ent(object) + if ent then + if not inv then + inv = player:get_inventory() if not inv then - inv = player:get_inventory() - if not inv then - minetest.log("error", "[item_drop] Couldn't " .. - "get inventory") - return - end + minetest.log("error", "[item_drop] Couldn't " .. + "get inventory") + return end - if inv:room_for_item("main", - ItemStack(ent.itemstring) - ) then - local pos2 = object:getpos() - local distance = vector.distance(pos, pos2) - if distance <= 1 then - inv:add_item("main", ItemStack( - ent.itemstring)) - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) - ent.itemstring = "" - object:remove() - else - local vel = vector.multiply( - vector.subtract(pos, pos2), 3) - vel.y = vel.y + 0.6 - object:setvelocity(vel) - ent.physical_state = false - ent.object:set_properties({ - physical = false - }) + end + if inv:room_for_item("main", ItemStack(ent.itemstring)) then + local pos2 = object:getpos() + local distance = vector.distance(pos, pos2) + if distance <= 1 then + inv:add_item("main", ItemStack( + ent.itemstring)) + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = pickup_gain, + }) + ent.itemstring = "" + object:remove() + else + local vel = vector.multiply( + vector.subtract(pos, pos2), 3) + vel.y = vel.y + 0.6 + object:setvelocity(vel) + ent.physical_state = false + ent.object:set_properties({ + physical = false + }) - minetest.after(1.0, afterflight, - object, inv, player) - end + minetest.after(1.0, afterflight, + object, inv, player) end end end @@ -130,7 +126,10 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end local function pickup_step() - pickupfunc() + local players = minetest.get_connected_players() + for i = 1,#players do + pickupfunc(players[i]) + end minetest.after(0.01, pickup_step) end minetest.after(3.0, pickup_step) From fced0590c6e144ab5903e2b6e52607e7e726d62f Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Thu, 7 Sep 2017 21:13:10 +0200 Subject: [PATCH 23/83] Add code for zero velocity mode --- init.lua | 98 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 60 insertions(+), 38 deletions(-) diff --git a/init.lua b/init.lua index f4ea02b..b12dbb7 100644 --- a/init.lua +++ b/init.lua @@ -3,6 +3,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then minetest.settings:get("item_drop.pickup_sound_gain")) or 0.4 local pickup_radius = tonumber( minetest.settings:get("item_drop.pickup_radius")) or 0.75 + local inner_radius = 1 local pickup_age = tonumber( minetest.settings:get("item_drop.pickup_age")) or 0.5 local key_triggered = minetest.settings:get_bool( @@ -13,45 +14,66 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end local damage_enabled = minetest.settings:get_bool("enable_damage") - -- gets the object's luaentity if it can be collected - local function opt_get_ent(object) - if object:is_player() then - return - end - local ent = object:get_luaentity() - if not ent - or ent.name ~= "__builtin:item" - or (ent.dropped_by and ent.age < pickup_age) - or ent.itemstring == "" then - return - end - return ent - end + -- TODO add proper magnet range settings + local zero_velocity_mode = pickup_age == -1 + and pickup_radius <= inner_radius - -- take item or reset velocity after flying a second - local function afterflight(object, inv, player) - local ent = opt_get_ent(object) - if not ent then - return + -- opt_get_ent gets the object's luaentity if it can be collected + local opt_get_ent, afterflight + if zero_velocity_mode then + function opt_get_ent(object) + if object:is_player() + or not vector.equals(object:getvelocity(), {x=0, y=0, z=0}) then + return + end + local ent = object:get_luaentity() + if not ent + or ent.name ~= "__builtin:item" + or ent.itemstring == "" then + return + end + return ent end - if inv - and inv:room_for_item("main", - ItemStack(ent.itemstring) - ) then - inv:add_item("main", - ItemStack(ent.itemstring)) - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) - ent.itemstring = "" - object:remove() - else - object:setvelocity({x=0,y=0,z=0}) - ent.physical_state = true - ent.object:set_properties({ - physical = true - }) + else + function opt_get_ent(object) + if object:is_player() then + return + end + local ent = object:get_luaentity() + if not ent + or ent.name ~= "__builtin:item" + or (ent.dropped_by and ent.age < pickup_age) + or ent.itemstring == "" then + return + end + return ent + end + + -- take item or reset velocity after flying a second + function afterflight(object, inv, player) + local ent = opt_get_ent(object) + if not ent then + return + end + if inv + and inv:room_for_item("main", + ItemStack(ent.itemstring) + ) then + inv:add_item("main", + ItemStack(ent.itemstring)) + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = pickup_gain, + }) + ent.itemstring = "" + object:remove() + else + object:setvelocity({x=0,y=0,z=0}) + ent.physical_state = true + ent.object:set_properties({ + physical = true + }) + end end end @@ -98,7 +120,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then if inv:room_for_item("main", ItemStack(ent.itemstring)) then local pos2 = object:getpos() local distance = vector.distance(pos, pos2) - if distance <= 1 then + if distance <= inner_radius then inv:add_item("main", ItemStack( ent.itemstring)) minetest.sound_play("item_drop_pickup", { From 31229760e8af9a888d995ab3095c61ba6bc61256 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Thu, 7 Sep 2017 21:19:33 +0200 Subject: [PATCH 24/83] Play the pickup sound positional to all players --- init.lua | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/init.lua b/init.lua index b12dbb7..1ebd84a 100644 --- a/init.lua +++ b/init.lua @@ -18,6 +18,17 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local zero_velocity_mode = pickup_age == -1 and pickup_radius <= inner_radius + -- adds the item to the inventory and removes the object + local function collect_item(inv, item, ent, object, pos) + inv:add_item("main", item) + minetest.sound_play("item_drop_pickup", { + pos = pos, + gain = pickup_gain, + }) + ent.itemstring = "" + object:remove() + end + -- opt_get_ent gets the object's luaentity if it can be collected local opt_get_ent, afterflight if zero_velocity_mode then @@ -50,23 +61,15 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end -- take item or reset velocity after flying a second - function afterflight(object, inv, player) + function afterflight(object, inv) local ent = opt_get_ent(object) if not ent then return end + local item = ItemStack(ent.itemstring) if inv - and inv:room_for_item("main", - ItemStack(ent.itemstring) - ) then - inv:add_item("main", - ItemStack(ent.itemstring)) - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) - ent.itemstring = "" - object:remove() + and inv:room_for_item("main", item) then + collect_item(inv, item, ent, object, object:get_pos()) else object:setvelocity({x=0,y=0,z=0}) ent.physical_state = true @@ -117,18 +120,12 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then return end end - if inv:room_for_item("main", ItemStack(ent.itemstring)) then + local item = ItemStack(ent.itemstring) + if inv:room_for_item("main", item) then local pos2 = object:getpos() local distance = vector.distance(pos, pos2) if distance <= inner_radius then - inv:add_item("main", ItemStack( - ent.itemstring)) - minetest.sound_play("item_drop_pickup", { - to_player = player:get_player_name(), - gain = pickup_gain, - }) - ent.itemstring = "" - object:remove() + collect_item(inv, item, ent, object, pos) else local vel = vector.multiply( vector.subtract(pos, pos2), 3) @@ -139,8 +136,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then physical = false }) - minetest.after(1.0, afterflight, - object, inv, player) + minetest.after(1.0, afterflight, object, inv) end end end From f2e333826526d249ea753d92572cf6a5b7b18dac Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Fri, 8 Sep 2017 20:25:16 +0200 Subject: [PATCH 25/83] Add magnet_radius setting --- init.lua | 19 +++++++++++++------ settingtypes.txt | 7 ++++++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/init.lua b/init.lua index 1ebd84a..1622d90 100644 --- a/init.lua +++ b/init.lua @@ -3,7 +3,8 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then minetest.settings:get("item_drop.pickup_sound_gain")) or 0.4 local pickup_radius = tonumber( minetest.settings:get("item_drop.pickup_radius")) or 0.75 - local inner_radius = 1 + local magnet_radius = tonumber( + minetest.settings:get("item_drop.magnet_radius")) or -1 local pickup_age = tonumber( minetest.settings:get("item_drop.pickup_age")) or 0.5 local key_triggered = minetest.settings:get_bool( @@ -14,9 +15,12 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end local damage_enabled = minetest.settings:get_bool("enable_damage") - -- TODO add proper magnet range settings + local magnet_mode = magnet_radius > pickup_radius local zero_velocity_mode = pickup_age == -1 - and pickup_radius <= inner_radius + if magnet_mode + and zero_velocity_mode then + error"zero velocity mode can't be used together with magnet mode" + end -- adds the item to the inventory and removes the object local function collect_item(inv, item, ent, object, pos) @@ -30,7 +34,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end -- opt_get_ent gets the object's luaentity if it can be collected - local opt_get_ent, afterflight + local opt_get_ent if zero_velocity_mode then function opt_get_ent(object) if object:is_player() @@ -59,7 +63,10 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end return ent end + end + local afterflight + if magnet_mode then -- take item or reset velocity after flying a second function afterflight(object, inv) local ent = opt_get_ent(object) @@ -107,7 +114,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local inv local objectlist = minetest.get_objects_inside_radius(pos, - pickup_radius) + magnet_mode and magnet_radius or pickup_radius) for i = 1,#objectlist do local object = objectlist[i] local ent = opt_get_ent(object) @@ -124,7 +131,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then if inv:room_for_item("main", item) then local pos2 = object:getpos() local distance = vector.distance(pos, pos2) - if distance <= inner_radius then + if distance <= pickup_radius then collect_item(inv, item, ent, object, pos) else local vel = vector.multiply( diff --git a/settingtypes.txt b/settingtypes.txt index 1ea13da..4090ad0 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -13,8 +13,13 @@ item_drop.pickup_keytype (Pickup keytype) enum Use Use,Sneak,LeftAndRight,RMB,Sn #The volume of the pickup sound item_drop.pickup_sound_gain (Pickup sound gain) float 0.4 -#Player pickup radius +#Player pickup radius, the maximum distance from which items can be collected item_drop.pickup_radius (Pickup radius) float 0.75 +#Magnet radius, items between pickup_radius and this begin flying to the player +#Set it to -1 (or something else smaller than pickup_radius) to disable item +#flying +item_drop.magnet_radius (Magnet radius) float -1 + #Time delay in seconds after autopicking an item if it's dropped by a player item_drop.pickup_age (Pickup age) float 0.5 From 9de8d39af67b19d5514daf6a45cd5c7d3b6cbdcc Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Fri, 8 Sep 2017 20:36:36 +0200 Subject: [PATCH 26/83] Add keyinvert setting --- init.lua | 4 +++- settingtypes.txt | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/init.lua b/init.lua index 1622d90..13df171 100644 --- a/init.lua +++ b/init.lua @@ -9,6 +9,8 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then minetest.settings:get("item_drop.pickup_age")) or 0.5 local key_triggered = minetest.settings:get_bool( "item_drop.enable_pickup_key") ~= false + local key_invert = minetest.settings:get_bool( + "item_drop.pickup_keyinvert") or false local keytype if key_triggered then keytype = minetest.settings:get("item_drop.pickup_keytype") or "Use" @@ -104,7 +106,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then keys_pressed = control.sneak and control.RMB end - if not keys_pressed + if keys_pressed == key_invert or (damage_enabled and player:get_hp() <= 0) then return end diff --git a/settingtypes.txt b/settingtypes.txt index 4090ad0..b0e589d 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -7,6 +7,9 @@ item_drop.enable_item_drop (Enable item drops) bool true #Use a key to pick up items item_drop.enable_pickup_key (Use pickup key) bool true +#Collect items when the key is not pressed instead of when it is pressed +item_drop.pickup_keyinvert (Invert pickup key) bool false + #What keytype to use as pickup key item_drop.pickup_keytype (Pickup keytype) enum Use Use,Sneak,LeftAndRight,RMB,SneakAndRMB From c21158ffab97dbe0851b107503fe023c33b00a1a Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Fri, 8 Sep 2017 20:38:20 +0200 Subject: [PATCH 27/83] Adjust default key settings --- init.lua | 4 ++-- settingtypes.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/init.lua b/init.lua index 13df171..cd5f0a7 100644 --- a/init.lua +++ b/init.lua @@ -10,10 +10,10 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local key_triggered = minetest.settings:get_bool( "item_drop.enable_pickup_key") ~= false local key_invert = minetest.settings:get_bool( - "item_drop.pickup_keyinvert") or false + "item_drop.pickup_keyinvert") ~= false local keytype if key_triggered then - keytype = minetest.settings:get("item_drop.pickup_keytype") or "Use" + keytype = minetest.settings:get("item_drop.pickup_keytype") or "Sneak" end local damage_enabled = minetest.settings:get_bool("enable_damage") diff --git a/settingtypes.txt b/settingtypes.txt index b0e589d..72965db 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -8,10 +8,10 @@ item_drop.enable_item_drop (Enable item drops) bool true item_drop.enable_pickup_key (Use pickup key) bool true #Collect items when the key is not pressed instead of when it is pressed -item_drop.pickup_keyinvert (Invert pickup key) bool false +item_drop.pickup_keyinvert (Invert pickup key) bool true #What keytype to use as pickup key -item_drop.pickup_keytype (Pickup keytype) enum Use Use,Sneak,LeftAndRight,RMB,SneakAndRMB +item_drop.pickup_keytype (Pickup keytype) enum Sneak Use,Sneak,LeftAndRight,RMB,SneakAndRMB #The volume of the pickup sound item_drop.pickup_sound_gain (Pickup sound gain) float 0.4 From c86bc605bdedc04b1064943bb6f52434e0d357ee Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Fri, 8 Sep 2017 20:42:28 +0200 Subject: [PATCH 28/83] Add item flight time setting, set it to 5 seconds by default --- init.lua | 4 +++- settingtypes.txt | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/init.lua b/init.lua index cd5f0a7..94c2db9 100644 --- a/init.lua +++ b/init.lua @@ -5,6 +5,8 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then minetest.settings:get("item_drop.pickup_radius")) or 0.75 local magnet_radius = tonumber( minetest.settings:get("item_drop.magnet_radius")) or -1 + local magnet_time = tonumber( + minetest.settings:get("item_drop.magnet_time")) or 5.0 local pickup_age = tonumber( minetest.settings:get("item_drop.pickup_age")) or 0.5 local key_triggered = minetest.settings:get_bool( @@ -145,7 +147,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then physical = false }) - minetest.after(1.0, afterflight, object, inv) + minetest.after(magnet_time, afterflight, object, inv) end end end diff --git a/settingtypes.txt b/settingtypes.txt index 72965db..288ac95 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -24,5 +24,9 @@ item_drop.pickup_radius (Pickup radius) float 0.75 #flying item_drop.magnet_radius (Magnet radius) float -1 +#Item flight duration, items flying for more than this time are added to the +#player's inventory +item_drop.magnet_time (Magnet time) float 5.0 + #Time delay in seconds after autopicking an item if it's dropped by a player item_drop.pickup_age (Pickup age) float 0.5 From b06129c3a37ec55d58ba535e534493017507f843 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Fri, 8 Sep 2017 20:43:30 +0200 Subject: [PATCH 29/83] Fix redundant minetest.after invocations --- init.lua | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/init.lua b/init.lua index 94c2db9..ca08091 100644 --- a/init.lua +++ b/init.lua @@ -142,12 +142,15 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then vector.subtract(pos, pos2), 3) vel.y = vel.y + 0.6 object:setvelocity(vel) - ent.physical_state = false - ent.object:set_properties({ - physical = false - }) + if ent.physical_state then + ent.physical_state = false + ent.object:set_properties({ + physical = false + }) - minetest.after(magnet_time, afterflight, object, inv) + minetest.after(magnet_time, afterflight, + object, inv) + end end end end From 6de1402ebcd0cc9a854f652b0cddf393946fc184 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Fri, 8 Sep 2017 20:46:36 +0200 Subject: [PATCH 30/83] Remove damage setting test --- init.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/init.lua b/init.lua index ca08091..51a29b7 100644 --- a/init.lua +++ b/init.lua @@ -17,7 +17,6 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then if key_triggered then keytype = minetest.settings:get("item_drop.pickup_keytype") or "Sneak" end - local damage_enabled = minetest.settings:get_bool("enable_damage") local magnet_mode = magnet_radius > pickup_radius local zero_velocity_mode = pickup_age == -1 @@ -109,7 +108,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end if keys_pressed == key_invert - or (damage_enabled and player:get_hp() <= 0) then + or player:get_hp() <= 0 then return end From 88df92b12549d5090e9a043932ca252f8d81a536 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Fri, 8 Sep 2017 20:57:05 +0200 Subject: [PATCH 31/83] Fix key triggering disabling --- init.lua | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/init.lua b/init.lua index 51a29b7..7cece4f 100644 --- a/init.lua +++ b/init.lua @@ -90,24 +90,39 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end end - local function pickupfunc(player) - local keys_pressed = not key_triggered + -- set keytype to the key name if possible + if keytype == "Use" then + keytype = "aux1" + elseif keytype == "Sneak" then + keytype = "sneak" + elseif keytype == "LeftAndRight" then -- LeftAndRight combination + keytype = 0 + elseif keytype == "SneakAndRMB" then -- SneakAndRMB combination + keytype = 1 + end - local control = player:get_player_control() - if keytype == "Use" then - keys_pressed = control.aux1 - elseif keytype == "Sneak" then - keys_pressed = control.sneak - elseif keytype == "LeftAndRight" then -- LeftAndRight combination - keys_pressed = control.left and control.right - elseif keytype == "RMB" then - keys_pressed = control.RMB - elseif keytype == "SneakAndRMB" then -- SneakAndRMB combination - keys_pressed = control.sneak and control.RMB + -- tests if the player has the keys pressed to enable item picking + local function keys_pressed(player) + if not key_triggered then + return true end - if keys_pressed == key_invert + local control = player:get_player_control() + local keys_pressed + if keytype == 0 then -- LeftAndRight combination + keys_pressed = control.left and control.right + elseif keytpye == 1 then -- SneakAndRMB combination + keys_pressed = control.sneak and control.RMB + else + keys_pressed = control[keytype] + end + + return keys_pressed ~= key_invert + end + + local function pickupfunc(player) + if not keys_pressed(player) or player:get_hp() <= 0 then return end From 253cc75c5185de92403037cb61ab2c45a6ea27ff Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Fri, 8 Sep 2017 21:26:08 +0200 Subject: [PATCH 32/83] Higher update delay if no item was found avoid loud pop noise (in zero velocity mode) --- init.lua | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index 7cece4f..90c18be 100644 --- a/init.lua +++ b/init.lua @@ -130,6 +130,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local pos = player:getpos() pos.y = pos.y+0.5 local inv + local got_item = false local objectlist = minetest.get_objects_inside_radius(pos, magnet_mode and magnet_radius or pickup_radius) @@ -147,8 +148,15 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end local item = ItemStack(ent.itemstring) if inv:room_for_item("main", item) then + if zero_velocity_mode then + -- collect one item at a time in zero velocity mode + -- to avoid the loud pop + collect_item(inv, item, ent, object, pos) + return true + end local pos2 = object:getpos() local distance = vector.distance(pos, pos2) + got_item = true if distance <= pickup_radius then collect_item(inv, item, ent, object, pos) else @@ -169,14 +177,23 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end end end + return got_item end local function pickup_step() + local got_item local players = minetest.get_connected_players() for i = 1,#players do - pickupfunc(players[i]) + got_item = got_item or pickupfunc(players[i]) end - minetest.after(0.01, pickup_step) + -- lower step if takeable item(s) were found + local time + if got_item then + time = 0.02 + else + time = 0.2 + end + minetest.after(time, pickup_step) end minetest.after(3.0, pickup_step) end From 06c1212d5b4bfffebb0238c72fbc13fa7587b24e Mon Sep 17 00:00:00 2001 From: texmex Date: Mon, 11 Sep 2017 13:09:11 +0200 Subject: [PATCH 33/83] Lower pickup sound gain --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.lua b/init.lua index 90c18be..da9907f 100644 --- a/init.lua +++ b/init.lua @@ -1,6 +1,6 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local pickup_gain = tonumber( - minetest.settings:get("item_drop.pickup_sound_gain")) or 0.4 + minetest.settings:get("item_drop.pickup_sound_gain")) or 0.2 local pickup_radius = tonumber( minetest.settings:get("item_drop.pickup_radius")) or 0.75 local magnet_radius = tonumber( From 1e2287a6726b182d1e683bed221c79676d9d91a0 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Mon, 11 Sep 2017 14:08:01 +0200 Subject: [PATCH 34/83] Do not pick items if the player has no interact --- init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/init.lua b/init.lua index da9907f..4f6fac2 100644 --- a/init.lua +++ b/init.lua @@ -121,8 +121,10 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then return keys_pressed ~= key_invert end + -- this function is called for each player to possibly collect items local function pickupfunc(player) if not keys_pressed(player) + or not minetest.get_player_privs(player:get_player_name()).interact or player:get_hp() <= 0 then return end From 35786b597c26baf46817413de18277c8aa5f4678 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Mon, 11 Sep 2017 14:09:24 +0200 Subject: [PATCH 35/83] Update mod load logging There's no official setting called log_mods --- init.lua | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index 4f6fac2..158e612 100644 --- a/init.lua +++ b/init.lua @@ -1,3 +1,6 @@ +local load_time_start = minetest.get_us_time() + + if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local pickup_gain = tonumber( minetest.settings:get("item_drop.pickup_sound_gain")) or 0.2 @@ -246,6 +249,11 @@ if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false then end end -if minetest.settings:get("log_mods") then - minetest.log("action", "[Mod] item_drop loaded") + +local time = (minetest.get_us_time() - load_time_start) / 1000000 +local msg = "[item_drop] loaded after ca. " .. time .. " seconds." +if time > 0.01 then + print(msg) +else + minetest.log("info", msg) end From ac2da1689e64e6ff5a23e764412374c38c45c6a3 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Mon, 11 Sep 2017 14:22:17 +0200 Subject: [PATCH 36/83] Update item dropping code --- init.lua | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/init.lua b/init.lua index 158e612..f673878 100644 --- a/init.lua +++ b/init.lua @@ -204,19 +204,22 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false then + local creative_enabled = minetest.settings:get_bool("creative_mode") + function minetest.handle_node_drops(pos, drops, digger) local inv local diggerPos = pos - if minetest.settings:get_bool("creative_mode") + if creative_enabled and digger and digger:is_player() then inv = digger:get_inventory() diggerPos = digger:getpos() end - for _,item in ipairs(drops) do + for i = 1,#drops do + local item = drops[i] local count, name if type(item) == "string" then count = 1 @@ -226,20 +229,21 @@ if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false then name = item:get_name() end - if not inv or not inv:contains_item("main", ItemStack(name)) then - for i=1,count do + if not inv + or not inv:contains_item("main", ItemStack(name)) then + for _ = 1,count do + local obj = minetest.add_item(diggerPos, name) - local adjustedPos = {x=diggerPos.x, y=diggerPos.y, - z=diggerPos.z} - local obj = minetest.add_item(adjustedPos, name) - - if obj ~= nil then + if obj then obj:get_luaentity().collect = true - local x = math.random(1, 5) - if math.random(1,2) == 1 then x = -x end - - local z = math.random(1, 5) - if math.random(1,2) == 1 then z = -z end + local x = math.random(-5, 4) + if x >= 0 then + x = x+1 + end + local z = math.random(-5, 4) + if z >= 0 then + z = z+1 + end obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) end From f811009c807e2349ec4cd41d4ee868feb0e570e1 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Mon, 11 Sep 2017 14:35:55 +0200 Subject: [PATCH 37/83] Don't override handle_node_drops in creative mode --- init.lua | 53 ++++++++++++++++++------------------------------ settingtypes.txt | 2 +- 2 files changed, 21 insertions(+), 34 deletions(-) diff --git a/init.lua b/init.lua index f673878..24e12a2 100644 --- a/init.lua +++ b/init.lua @@ -203,21 +203,9 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then minetest.after(3.0, pickup_step) end -if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false then - local creative_enabled = minetest.settings:get_bool("creative_mode") - - function minetest.handle_node_drops(pos, drops, digger) - - local inv - local diggerPos = pos - - if creative_enabled - and digger - and digger:is_player() then - inv = digger:get_inventory() - diggerPos = digger:getpos() - end - +if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false +and not minetest.settings:get_bool("creative_mode") then + function minetest.handle_node_drops(pos, drops) for i = 1,#drops do local item = drops[i] local count, name @@ -229,25 +217,24 @@ if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false then name = item:get_name() end - if not inv - or not inv:contains_item("main", ItemStack(name)) then - for _ = 1,count do - local obj = minetest.add_item(diggerPos, name) - - if obj then - obj:get_luaentity().collect = true - local x = math.random(-5, 4) - if x >= 0 then - x = x+1 - end - local z = math.random(-5, 4) - if z >= 0 then - z = z+1 - end - - obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) - end + for _ = 1,count do + local obj = minetest.add_item(pos, name) + if not obj then + error("Couldn't spawn item") end + + local vel = obj:getvelocity() + local x = math.random(-5, 4) + if x >= 0 then + x = x+1 + end + vel.x = x + local z = math.random(-5, 4) + if z >= 0 then + z = z+1 + end + vel.z = z + obj:setvelocity(vel) end end end diff --git a/settingtypes.txt b/settingtypes.txt index 288ac95..d4f02e6 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -1,7 +1,7 @@ #Pick up items automatically item_drop.enable_item_pickup (Enable item pickups) bool true -#Drop items in-world on dig +#Drop items in-world on dig, does nothing in creative mode item_drop.enable_item_drop (Enable item drops) bool true #Use a key to pick up items From 8543bad2aa559f7ba008498aa1060c83ed6eb775 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Mon, 11 Sep 2017 14:44:31 +0200 Subject: [PATCH 38/83] Call on_punch to pick items (DS) --- init.lua | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/init.lua b/init.lua index 24e12a2..53778bd 100644 --- a/init.lua +++ b/init.lua @@ -29,14 +29,12 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end -- adds the item to the inventory and removes the object - local function collect_item(inv, item, ent, object, pos) - inv:add_item("main", item) + local function collect_item(ent, pos, player) minetest.sound_play("item_drop_pickup", { pos = pos, gain = pickup_gain, }) - ent.itemstring = "" - object:remove() + ent:on_punch(player) end -- opt_get_ent gets the object's luaentity if it can be collected @@ -74,7 +72,8 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local afterflight if magnet_mode then -- take item or reset velocity after flying a second - function afterflight(object, inv) + function afterflight(object, inv, player) + -- TODO: test what happens if player left the game local ent = opt_get_ent(object) if not ent then return @@ -82,7 +81,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local item = ItemStack(ent.itemstring) if inv and inv:room_for_item("main", item) then - collect_item(inv, item, ent, object, object:get_pos()) + collect_item(ent, object:get_pos(), player) else object:setvelocity({x=0,y=0,z=0}) ent.physical_state = true @@ -156,14 +155,14 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then if zero_velocity_mode then -- collect one item at a time in zero velocity mode -- to avoid the loud pop - collect_item(inv, item, ent, object, pos) + collect_item(ent, pos, player) return true end local pos2 = object:getpos() local distance = vector.distance(pos, pos2) got_item = true if distance <= pickup_radius then - collect_item(inv, item, ent, object, pos) + collect_item(ent, pos, player) else local vel = vector.multiply( vector.subtract(pos, pos2), 3) @@ -176,7 +175,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then }) minetest.after(magnet_time, afterflight, - object, inv) + object, inv, player) end end end From b5c7fbaa388aac27be5d2d5048305f6109aeb2e2 Mon Sep 17 00:00:00 2001 From: texmex Date: Mon, 11 Sep 2017 14:51:02 +0200 Subject: [PATCH 39/83] Reflect pickup sound gain in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d81a294..be129ac 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ item_drop can be played with Minetest 0.4.16 or above. It was originally develop - All settings may be configured from within the game itself (Settings tab > Advanced settings > Mods > item_drop) - Drops nodes as in-world items on dig if `enable_item_drop` is `true`. (true by default) - Pulls items to the player's inventory if `enable_item_pickup` is `true`. (true by default) It uses a node radius set in `pickup_radius` (default 0.75) -- Plays a sound the items are picked up, with the gain level set it `pickup_gain` (default 0.4) +- Plays a sound the items are picked up, with the gain level set it `pickup_gain` (default 0.2) - Requires a key to be pressed in order to pull items if `enable_item_pickup_key` is `true`. (true by default). The keytypes to choose from by setting `item_pickup_keytype` are: - Use key (`Use`) - Sneak key (`Sneak`) From 3a9a985cfc45c33aeadaa16ccf81525427baeba9 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Tue, 12 Sep 2017 09:55:16 +0200 Subject: [PATCH 40/83] Revert "Adjust default key settings" This reverts commit 3bc3a4bd25d445e0fbffe0158140a13346ced041. --- init.lua | 4 ++-- settingtypes.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/init.lua b/init.lua index 53778bd..fe4e23d 100644 --- a/init.lua +++ b/init.lua @@ -15,10 +15,10 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local key_triggered = minetest.settings:get_bool( "item_drop.enable_pickup_key") ~= false local key_invert = minetest.settings:get_bool( - "item_drop.pickup_keyinvert") ~= false + "item_drop.pickup_keyinvert") or false local keytype if key_triggered then - keytype = minetest.settings:get("item_drop.pickup_keytype") or "Sneak" + keytype = minetest.settings:get("item_drop.pickup_keytype") or "Use" end local magnet_mode = magnet_radius > pickup_radius diff --git a/settingtypes.txt b/settingtypes.txt index d4f02e6..1503e4b 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -8,10 +8,10 @@ item_drop.enable_item_drop (Enable item drops) bool true item_drop.enable_pickup_key (Use pickup key) bool true #Collect items when the key is not pressed instead of when it is pressed -item_drop.pickup_keyinvert (Invert pickup key) bool true +item_drop.pickup_keyinvert (Invert pickup key) bool false #What keytype to use as pickup key -item_drop.pickup_keytype (Pickup keytype) enum Sneak Use,Sneak,LeftAndRight,RMB,SneakAndRMB +item_drop.pickup_keytype (Pickup keytype) enum Use Use,Sneak,LeftAndRight,RMB,SneakAndRMB #The volume of the pickup sound item_drop.pickup_sound_gain (Pickup sound gain) float 0.4 From 609d441ef468c6f916894d11c1b25f7fce390839 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Tue, 12 Sep 2017 10:13:49 +0200 Subject: [PATCH 41/83] Always collect items one by one --- init.lua | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/init.lua b/init.lua index fe4e23d..140b753 100644 --- a/init.lua +++ b/init.lua @@ -123,7 +123,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then return keys_pressed ~= key_invert end - -- this function is called for each player to possibly collect items + -- called for each player to possibly collect an item, returns true if so local function pickupfunc(player) if not keys_pressed(player) or not minetest.get_player_privs(player:get_player_name()).interact @@ -134,7 +134,6 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local pos = player:getpos() pos.y = pos.y+0.5 local inv - local got_item = false local objectlist = minetest.get_objects_inside_radius(pos, magnet_mode and magnet_radius or pickup_radius) @@ -152,36 +151,33 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then end local item = ItemStack(ent.itemstring) if inv:room_for_item("main", item) then - if zero_velocity_mode then - -- collect one item at a time in zero velocity mode - -- to avoid the loud pop + local flying_item + local pos2 + if magnet_mode then + pos2 = object:getpos() + flying_item = vector.distance(pos, pos2) > pickup_radius + end + if not flying_item then + -- collect one item at a time to avoid the loud pop collect_item(ent, pos, player) return true end - local pos2 = object:getpos() - local distance = vector.distance(pos, pos2) - got_item = true - if distance <= pickup_radius then - collect_item(ent, pos, player) - else - local vel = vector.multiply( - vector.subtract(pos, pos2), 3) - vel.y = vel.y + 0.6 - object:setvelocity(vel) - if ent.physical_state then - ent.physical_state = false - ent.object:set_properties({ - physical = false - }) + local vel = vector.multiply( + vector.subtract(pos, pos2), 3) + vel.y = vel.y + 0.6 + object:setvelocity(vel) + if ent.physical_state then + ent.physical_state = false + ent.object:set_properties({ + physical = false + }) - minetest.after(magnet_time, afterflight, - object, inv, player) - end + minetest.after(magnet_time, afterflight, + object, inv, player) end end end end - return got_item end local function pickup_step() From cbd717b5497f35669e2b1324de2b02bc75706f6b Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Tue, 12 Sep 2017 10:49:57 +0200 Subject: [PATCH 42/83] Update README --- README.md | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index be129ac..f712464 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # item_drop -By [PilzAdam](https://github.com/PilzAdam), [texmex](https://github.com/tacotexmex/). +By [PilzAdam](https://github.com/PilzAdam), +[texmex](https://github.com/tacotexmex/). ## Description This mod adds Minecraft like drop/pick up of items to Minetest. @@ -8,24 +9,44 @@ This mod adds Minecraft like drop/pick up of items to Minetest. LGPLv2.1/CC BY-SA 3.0. ## Notes -item_drop can be played with Minetest 0.4.16 or above. It was originally developed by [PilzAdam](https://github.com/PilzAdam/item_drop). +item_drop can be played with Minetest 0.4.16 or above. It was originally +developed by [PilzAdam](https://github.com/PilzAdam/item_drop). ## List of features -- All settings may be configured from within the game itself (Settings tab > Advanced settings > Mods > item_drop) -- Drops nodes as in-world items on dig if `enable_item_drop` is `true`. (true by default) -- Pulls items to the player's inventory if `enable_item_pickup` is `true`. (true by default) It uses a node radius set in `pickup_radius` (default 0.75) -- Plays a sound the items are picked up, with the gain level set it `pickup_gain` (default 0.2) -- Requires a key to be pressed in order to pull items if `enable_item_pickup_key` is `true`. (true by default). The keytypes to choose from by setting `item_pickup_keytype` are: - - Use key (`Use`) - - Sneak key (`Sneak`) - - Left and Right keys combined (`LeftAndRight`) - - Right mouse button (`RMB`) - - Sneak key and right mouse button combined (`SneakAndRMB`) +* All settings may be configured from within the game itself. + (Settings tab > Advanced settings > Mods > item_drop) +* Drops nodes as in-world items on dig if `item_drop.enable_item_drop` is + `true` (true by default) It does nothing in creative mode. +* Puts dropped items to the player's inventory if `item_drop.enable_item_pickup` + is `true` (true by default) + * It uses a node radius set in `item_drop.pickup_radius` (default 0.75), + if items are within this radius around the player's belt, they're picked. + * If `item_drop.pickup_age` is something positive, items dropped by players + are ignored for this time to avoid instantly picking up when dropping. + * If `item_drop.pickup_age` is `-1`, items are only picked when they don't + move, it's another fix for instant item picking. + * If `item_drop.magnet_radius` is bigger than `item_drop.pickup_radius`, + items between these radii are flying to the player for + `item_drop.magnet_time` seconds, after this time, they're picked or stop + flying. +* Plays a sound when the items are picked up with the gain level set to + `item_drop.pickup_sound_gain` (default 0.2) +* Requires a key to be pressed in order to pick items if + `item_drop.enable_pickup_key` is `true` (true by default) + * The keytypes to choose from by setting `item_pickup_keytype` are: + * Use key (`Use`) + * Sneak key (`Sneak`) + * Left and Right keys combined (`LeftAndRight`) + * Right mouse button (`RMB`) + * Sneak key and right mouse button combined (`SneakAndRMB`) + * If `item_drop.pickup_keyinvert` is `true` (false by default), items are + collected when the key is not pressed instead of when it's pressed. ## Known issues ## Bug reports and suggestions -You can report bugs or suggest ideas by [filing an issue](http://github.com/tacotexmex/item_drop/issues/new). +You can report bugs or suggest ideas by +[filing an issue](http://github.com/tacotexmex/item_drop/issues/new). ## Links * [Download ZIP](https://github.com/tacotexmex/item_drop/archive/master.zip) From 464fce9a87c8691df519bb657ad8b925e2d1d32a Mon Sep 17 00:00:00 2001 From: texmex Date: Tue, 12 Sep 2017 13:12:23 +0200 Subject: [PATCH 43/83] Create CONTRIBUTING.md --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..7478dff --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,2 @@ +- Put rewrites and new features in branches. This way `master` branch can be stable to end-users at all times. +- Conform with setting defaults so that end-user upgrades doesn't change expected in-game behavior. Discuss default changes in an issue if one really need to change. From d5b28e01b01b9f17e7f44b4b6cc1885521903984 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Fri, 15 Sep 2017 10:27:28 +0200 Subject: [PATCH 44/83] Fix missing division for dropped item velocity calculation --- init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index 140b753..80194cd 100644 --- a/init.lua +++ b/init.lua @@ -223,12 +223,12 @@ and not minetest.settings:get_bool("creative_mode") then if x >= 0 then x = x+1 end - vel.x = x + vel.x = 1 / x local z = math.random(-5, 4) if z >= 0 then z = z+1 end - vel.z = z + vel.z = 1 / z obj:setvelocity(vel) end end From 2577b99556ec6b0f836000a751f5528715c6686a Mon Sep 17 00:00:00 2001 From: texmex Date: Fri, 15 Sep 2017 16:25:53 +0200 Subject: [PATCH 45/83] Update CONTRIBUTING.md --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7478dff..16a26e3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,2 +1,3 @@ -- Put rewrites and new features in branches. This way `master` branch can be stable to end-users at all times. +- The `master` branch should be stable to end-users at all times. It should target latest Minetest point release. +- Put rewrites and new features in branches. - Conform with setting defaults so that end-user upgrades doesn't change expected in-game behavior. Discuss default changes in an issue if one really need to change. From 70068fd30766f498e22f59bb3e316483570849bb Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Fri, 15 Sep 2017 18:40:11 +0200 Subject: [PATCH 46/83] Typo --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.lua b/init.lua index 80194cd..bf5aed3 100644 --- a/init.lua +++ b/init.lua @@ -114,7 +114,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local keys_pressed if keytype == 0 then -- LeftAndRight combination keys_pressed = control.left and control.right - elseif keytpye == 1 then -- SneakAndRMB combination + elseif keytype == 1 then -- SneakAndRMB combination keys_pressed = control.sneak and control.RMB else keys_pressed = control[keytype] From 3d88b7b5c6a8db9d0b9952c75b3cdfad5b72be3c Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Sat, 16 Sep 2017 12:57:21 +0200 Subject: [PATCH 47/83] Disable item pickup age if the player has to hold a key for taking items --- init.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/init.lua b/init.lua index bf5aed3..e28c79c 100644 --- a/init.lua +++ b/init.lua @@ -19,6 +19,10 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local keytype if key_triggered then keytype = minetest.settings:get("item_drop.pickup_keytype") or "Use" + -- disable pickup age if picking is explicitly enabled by the player + if not key_invert then + pickup_age = math.min(pickup_age, 0) + end end local magnet_mode = magnet_radius > pickup_radius From f1fcc478a174a95caa6d59b94579a9ac52f412f8 Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Sat, 16 Sep 2017 13:18:20 +0200 Subject: [PATCH 48/83] Rename the key press test function --- init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index e28c79c..70b44d2 100644 --- a/init.lua +++ b/init.lua @@ -109,7 +109,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then -- tests if the player has the keys pressed to enable item picking - local function keys_pressed(player) + local function has_keys_pressed(player) if not key_triggered then return true end @@ -129,7 +129,7 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then -- called for each player to possibly collect an item, returns true if so local function pickupfunc(player) - if not keys_pressed(player) + if not has_keys_pressed(player) or not minetest.get_player_privs(player:get_player_name()).interact or player:get_hp() <= 0 then return From 15968a024001886b94e68b04b47de5f21437be0e Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Sun, 17 Jun 2018 07:35:06 +0200 Subject: [PATCH 49/83] Update readme --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f712464..ddbfb01 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # item_drop By [PilzAdam](https://github.com/PilzAdam), -[texmex](https://github.com/tacotexmex/). +[texmex](https://github.com/tacotexmex/), [hybriddog](https://github.com/hybriddog/). ## Description This mod adds Minecraft like drop/pick up of items to Minetest. @@ -46,9 +46,9 @@ developed by [PilzAdam](https://github.com/PilzAdam/item_drop). ## Bug reports and suggestions You can report bugs or suggest ideas by -[filing an issue](http://github.com/tacotexmex/item_drop/issues/new). +[filing an issue](http://github.com/minetest-mods/item_drop/issues/new). ## Links -* [Download ZIP](https://github.com/tacotexmex/item_drop/archive/master.zip) -* [Source](https://github.com/tacotexmex/item_drop/) +* [Download ZIP](https://github.com/minetest-mods/item_drop/archive/master.zip) +* [Source](https://github.com/minetest-mods/item_drop/) * [Forum thread](https://forum.minetest.net/viewtopic.php?t=16913) From 08ba36451037ed65c3a31caf895f537b35986efe Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Sun, 17 Jun 2018 09:27:43 +0200 Subject: [PATCH 50/83] Look for legacy setting names --- init.lua | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/init.lua b/init.lua index 70b44d2..65169a6 100644 --- a/init.lua +++ b/init.lua @@ -1,9 +1,11 @@ local load_time_start = minetest.get_us_time() +pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) - -if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then +if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false or +minetest.settings:get_bool("enable_item_pickup") ~= false then local pickup_gain = tonumber( - minetest.settings:get("item_drop.pickup_sound_gain")) or 0.2 + minetest.settings:get("item_drop.pickup_sound_gain")) or + tonumber(minetest.settings:get("item_pickup_gain")) or 0.2 local pickup_radius = tonumber( minetest.settings:get("item_drop.pickup_radius")) or 0.75 local magnet_radius = tonumber( @@ -13,12 +15,14 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then local pickup_age = tonumber( minetest.settings:get("item_drop.pickup_age")) or 0.5 local key_triggered = minetest.settings:get_bool( - "item_drop.enable_pickup_key") ~= false + "item_drop.enable_pickup_key") or + minetest.settings:get_bool("enable_item_pickup_key") ~= false local key_invert = minetest.settings:get_bool( "item_drop.pickup_keyinvert") or false local keytype if key_triggered then - keytype = minetest.settings:get("item_drop.pickup_keytype") or "Use" + keytype = minetest.settings:get("item_drop.pickup_keytype") or + minetest.settings:get("item_pickup_keytype") or "Use" -- disable pickup age if picking is explicitly enabled by the player if not key_invert then pickup_age = math.min(pickup_age, 0) @@ -202,7 +206,8 @@ if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false then minetest.after(3.0, pickup_step) end -if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false +if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false or +minetest.settings:get_bool("enable_item_drop") ~= false and not minetest.settings:get_bool("creative_mode") then function minetest.handle_node_drops(pos, drops) for i = 1,#drops do From b6b1a8e95bc20c69e9a27ba8eb6f1edc9e2fdb7a Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Mon, 18 Jun 2018 10:18:06 +0200 Subject: [PATCH 51/83] Complete pickup particle feature --- init.lua | 45 +++++++++++++++++++++++++++++++++++++++++++++ settingtypes.txt | 3 +++ 2 files changed, 48 insertions(+) diff --git a/init.lua b/init.lua index 65169a6..ad24afd 100644 --- a/init.lua +++ b/init.lua @@ -6,6 +6,8 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then local pickup_gain = tonumber( minetest.settings:get("item_drop.pickup_sound_gain")) or tonumber(minetest.settings:get("item_pickup_gain")) or 0.2 + local pickup_particle = + minetest.settings:get_bool("item_drop.pickup_particle") ~= false local pickup_radius = tonumber( minetest.settings:get("item_drop.pickup_radius")) or 0.75 local magnet_radius = tonumber( @@ -42,6 +44,49 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then pos = pos, gain = pickup_gain, }) + if pickup_particle then + local item = minetest.registered_nodes[ent.itemstring:gsub("(.*)%s.*$","%1")] + local image = "" + if minetest.registered_items[item.name] and minetest.registered_items[item.name].tiles then + if minetest.registered_items[item.name].tiles[1] then + local dt = minetest.registered_items[item.name].drawtype + if dt == "normal" or dt == "allfaces" or dt == "allfaces_optional" + or dt == "glasslike" or dt =="glasslike_framed" or dt == "glasslike_framed_optional" + or dt == "liquid" or dt == "flowingliquid" then + local tiles = minetest.registered_items[item.name].tiles + + local top = tiles[1] + if (type(top) == "table") then top = top.item end + local left = tiles[3] + if not left then left = top end + if (type(left) == "table") then left = left.item end + local right = tiles[5] + if not right then right = left end + if (type(right) == "table") then right = right.item end + + image = "[inventorycube{"..top.."{"..left.."{"..right + else + image = minetest.registered_items[item.name].inventory_image + if not image then image = minetest.registered_items[item.name].tiles[1] end + end + end + end + if item then + local texture = item.tiles[1] or item.inventory_image or "" + if item.drawtype == "normal" then + texture = item.tiles + end + minetest.add_particle({ + pos = {x = pos.x, y = pos.y + 1.5, z = pos.z}, + velocity = {x = 0, y = 1, z = 0}, + acceleration = {x = 0, y = -4, z = 0}, + expirationtime = 0.2, + size = 3,--math.random() + 0.5, + vertical = false, + texture = image, + }) + end + end ent:on_punch(player) end diff --git a/settingtypes.txt b/settingtypes.txt index 1503e4b..0bf3684 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -16,6 +16,9 @@ item_drop.pickup_keytype (Pickup keytype) enum Use Use,Sneak,LeftAndRight,RMB,Sn #The volume of the pickup sound item_drop.pickup_sound_gain (Pickup sound gain) float 0.4 +#Display a particle of the item picked up above the player +item_drop.pickup_particle (Pickup particle) bool true + #Player pickup radius, the maximum distance from which items can be collected item_drop.pickup_radius (Pickup radius) float 0.75 From cce81f6fe934e479bd0788f49fe8f148fea56400 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Mon, 18 Jun 2018 20:54:59 +0200 Subject: [PATCH 52/83] Fix settings bug --- init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index ad24afd..76c04a0 100644 --- a/init.lua +++ b/init.lua @@ -1,7 +1,7 @@ local load_time_start = minetest.get_us_time() pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) -if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false or +if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false and minetest.settings:get_bool("enable_item_pickup") ~= false then local pickup_gain = tonumber( minetest.settings:get("item_drop.pickup_sound_gain")) or @@ -251,7 +251,7 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then minetest.after(3.0, pickup_step) end -if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false or +if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false and minetest.settings:get_bool("enable_item_drop") ~= false and not minetest.settings:get_bool("creative_mode") then function minetest.handle_node_drops(pos, drops) From c57d3c1514f13ea8ddfd0192397b29fb800b43cb Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Sat, 23 Jun 2018 10:01:40 +0200 Subject: [PATCH 53/83] Fix crash on no drops (@HybridDog) --- init.lua | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/init.lua b/init.lua index ad24afd..3167b6e 100644 --- a/init.lua +++ b/init.lua @@ -47,7 +47,7 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then if pickup_particle then local item = minetest.registered_nodes[ent.itemstring:gsub("(.*)%s.*$","%1")] local image = "" - if minetest.registered_items[item.name] and minetest.registered_items[item.name].tiles then + if item and minetest.registered_items[item.name] and minetest.registered_items[item.name].tiles then if minetest.registered_items[item.name].tiles[1] then local dt = minetest.registered_items[item.name].drawtype if dt == "normal" or dt == "allfaces" or dt == "allfaces_optional" @@ -70,12 +70,6 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then if not image then image = minetest.registered_items[item.name].tiles[1] end end end - end - if item then - local texture = item.tiles[1] or item.inventory_image or "" - if item.drawtype == "normal" then - texture = item.tiles - end minetest.add_particle({ pos = {x = pos.x, y = pos.y + 1.5, z = pos.z}, velocity = {x = 0, y = 1, z = 0}, @@ -266,10 +260,15 @@ and not minetest.settings:get_bool("creative_mode") then name = item:get_name() end + if name == "" then + -- Sometimes nothing should be dropped + count = 0 + end + for _ = 1,count do local obj = minetest.add_item(pos, name) if not obj then - error("Couldn't spawn item") + error("Couldn't spawn item " .. name .. ", drops: " .. dump(drops)) end local vel = obj:getvelocity() From 1e5718cbacd2c5ed96997aeacedfa562c6607e05 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Sat, 23 Jun 2018 10:02:04 +0200 Subject: [PATCH 54/83] Fix settings bug --- init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index 3167b6e..58ccf93 100644 --- a/init.lua +++ b/init.lua @@ -1,7 +1,7 @@ local load_time_start = minetest.get_us_time() pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) -if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false or +if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false and minetest.settings:get_bool("enable_item_pickup") ~= false then local pickup_gain = tonumber( minetest.settings:get("item_drop.pickup_sound_gain")) or @@ -245,7 +245,7 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then minetest.after(3.0, pickup_step) end -if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false or +if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false and minetest.settings:get_bool("enable_item_drop") ~= false and not minetest.settings:get_bool("creative_mode") then function minetest.handle_node_drops(pos, drops) From 608b5dfe6ec3acf5f43c7140a7f46f065a132860 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Sat, 23 Jun 2018 10:09:02 +0200 Subject: [PATCH 55/83] Simplify inventorycube code (again) --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.lua b/init.lua index 58ccf93..8993cb6 100644 --- a/init.lua +++ b/init.lua @@ -64,7 +64,7 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then if not right then right = left end if (type(right) == "table") then right = right.item end - image = "[inventorycube{"..top.."{"..left.."{"..right + image = minetest.inventorycube(top, left, right) else image = minetest.registered_items[item.name].inventory_image if not image then image = minetest.registered_items[item.name].tiles[1] end From 50b976748d30f8b5a860b481c2762a5a89bab144 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Sat, 23 Jun 2018 10:15:40 +0200 Subject: [PATCH 56/83] Add WCILA code origin and license --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ddbfb01..8d2ec2b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ By [PilzAdam](https://github.com/PilzAdam), This mod adds Minecraft like drop/pick up of items to Minetest. ## Licensing -LGPLv2.1/CC BY-SA 3.0. +LGPLv2.1/CC BY-SA 3.0. Particle code from WCILA mod by Aurailus, originally licensed MIT. ## Notes item_drop can be played with Minetest 0.4.16 or above. It was originally From e2d370a17affa3563465dc2a4fd97cfabbd88484 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Sat, 23 Jun 2018 18:39:17 +0200 Subject: [PATCH 57/83] Reflect particle feature setting in readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8d2ec2b..1308653 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,8 @@ developed by [PilzAdam](https://github.com/PilzAdam/item_drop). `true` (true by default) It does nothing in creative mode. * Puts dropped items to the player's inventory if `item_drop.enable_item_pickup` is `true` (true by default) + * Multiple items are picked in a quick succession instead of all at once which + is indicated by the pickup sound. * It uses a node radius set in `item_drop.pickup_radius` (default 0.75), if items are within this radius around the player's belt, they're picked. * If `item_drop.pickup_age` is something positive, items dropped by players From 13be42cd3977bfee5516dbc92cec3dc35e6df6cb Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Sat, 23 Jun 2018 18:39:17 +0200 Subject: [PATCH 58/83] Reflect particle feature setting in readme --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 8d2ec2b..5771250 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,8 @@ developed by [PilzAdam](https://github.com/PilzAdam/item_drop). `true` (true by default) It does nothing in creative mode. * Puts dropped items to the player's inventory if `item_drop.enable_item_pickup` is `true` (true by default) + * Multiple items are picked in a quick succession instead of all at once which + is indicated by the pickup sound. * It uses a node radius set in `item_drop.pickup_radius` (default 0.75), if items are within this radius around the player's belt, they're picked. * If `item_drop.pickup_age` is something positive, items dropped by players @@ -41,6 +43,9 @@ developed by [PilzAdam](https://github.com/PilzAdam/item_drop). * Sneak key and right mouse button combined (`SneakAndRMB`) * If `item_drop.pickup_keyinvert` is `true` (false by default), items are collected when the key is not pressed instead of when it's pressed. +* Displays a particle of the picked item above the player if + `item_drop.pickup_particle` is `true` (true by default) + ## Known issues From 0112f1f9ec9421a765203e9fd7a67270388a2b96 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Mon, 6 Aug 2018 13:21:54 +0200 Subject: [PATCH 59/83] Tidy up pickup_particle code --- init.lua | 54 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/init.lua b/init.lua index 8993cb6..ddd6c82 100644 --- a/init.lua +++ b/init.lua @@ -38,6 +38,19 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then error"zero velocity mode can't be used together with magnet mode" end + -- tells whether an inventorycube should be shown as pickup_particle or not + -- for known drawtypes + local inventorycube_drawtypes = { + normal = true, + allfaces = true, + allfaces_optional = true, + glasslike = true, + glasslike_framed = true, + glasslike_framed_optional = true, + liquid = true, + flowingliquid = true, + } + -- adds the item to the inventory and removes the object local function collect_item(ent, pos, player) minetest.sound_play("item_drop_pickup", { @@ -45,30 +58,29 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then gain = pickup_gain, }) if pickup_particle then - local item = minetest.registered_nodes[ent.itemstring:gsub("(.*)%s.*$","%1")] + local item = minetest.registered_nodes[ + ent.itemstring:gsub("(.*)%s.*$", "%1")] local image = "" - if item and minetest.registered_items[item.name] and minetest.registered_items[item.name].tiles then - if minetest.registered_items[item.name].tiles[1] then - local dt = minetest.registered_items[item.name].drawtype - if dt == "normal" or dt == "allfaces" or dt == "allfaces_optional" - or dt == "glasslike" or dt =="glasslike_framed" or dt == "glasslike_framed_optional" - or dt == "liquid" or dt == "flowingliquid" then - local tiles = minetest.registered_items[item.name].tiles + if item and item.tiles and item.tiles[1] then + if inventorycube_drawtypes[item.drawtype] then + local tiles = item.tiles - local top = tiles[1] - if (type(top) == "table") then top = top.item end - local left = tiles[3] - if not left then left = top end - if (type(left) == "table") then left = left.item end - local right = tiles[5] - if not right then right = left end - if (type(right) == "table") then right = right.item end + local top = tiles[1] + if type(top) == "table" then + top = top.item + end + local left = tiles[3] or top + if type(left) == "table" then + left = left.item + end + local right = tiles[5] or left + if type(right) == "table" then + right = right.item + end - image = minetest.inventorycube(top, left, right) - else - image = minetest.registered_items[item.name].inventory_image - if not image then image = minetest.registered_items[item.name].tiles[1] end - end + image = minetest.inventorycube(top, left, right) + else + image = item.inventory_image or item.tiles[1] end minetest.add_particle({ pos = {x = pos.x, y = pos.y + 1.5, z = pos.z}, From 1d2e42eaabd917361c9bfa0a7943857ba6739374 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Mon, 6 Aug 2018 13:27:10 +0200 Subject: [PATCH 60/83] Fix crash when a node texture is a table --- init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/init.lua b/init.lua index ddd6c82..502445c 100644 --- a/init.lua +++ b/init.lua @@ -67,15 +67,15 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then local top = tiles[1] if type(top) == "table" then - top = top.item + top = top.name end local left = tiles[3] or top if type(left) == "table" then - left = left.item + left = left.name end local right = tiles[5] or left if type(right) == "table" then - right = right.item + right = right.name end image = minetest.inventorycube(top, left, right) From 02683056e56c261754bdfaa426a17effc3533f84 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Wed, 3 Oct 2018 17:07:25 +0200 Subject: [PATCH 61/83] Fix item magnet There is no field named physical_state, so the item didn't lose the physical property, but it happily hopped towards me after I dropped it. Disabling physical looked quite wrong, because the item flew through mountains. Instead, it gets zero acceleration now. To avoid resetting the acceleration in the on_step function, it is overridden to disable acceleration and velocity changes during executing the original on_step. Small code fix: Add underscores in set_velocity and set_acceleration --- init.lua | 50 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/init.lua b/init.lua index 502445c..77b8dde 100644 --- a/init.lua +++ b/init.lua @@ -142,13 +142,38 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then and inv:room_for_item("main", item) then collect_item(ent, object:get_pos(), player) else - object:setvelocity({x=0,y=0,z=0}) - ent.physical_state = true - ent.object:set_properties({ - physical = true - }) + -- the acceleration will be reset by the object's on_step + object:set_velocity({x=0,y=0,z=0}) + ent.is_magnet_item = false end end + + -- disable velocity and acceleration changes of items flying to players + minetest.after(0, function() + local ObjectRef + local blocked_methods = {"set_acceleration", "set_velocity", + "setacceleration", "setvelocity"} + local itemdef = minetest.registered_entities["__builtin:item"] + local old_on_step = itemdef.on_step + local function do_nothing() end + function itemdef.on_step(self, dtime) + if not self.is_magnet_item then + return old_on_step(self, dtime) + end + ObjectRef = ObjectRef or getmetatable(self.object) + local old_funcs = {} + for i = 1, #blocked_methods do + local method = blocked_methods[i] + old_funcs[method] = ObjectRef[method] + ObjectRef[method] = do_nothing + end + old_on_step(self, dtime) + for i = 1, #blocked_methods do + local method = blocked_methods[i] + ObjectRef[method] = old_funcs[method] + end + end + end) end -- set keytype to the key name if possible @@ -221,15 +246,12 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then collect_item(ent, pos, player) return true end - local vel = vector.multiply( - vector.subtract(pos, pos2), 3) + local vel = vector.multiply(vector.subtract(pos, pos2), 3) vel.y = vel.y + 0.6 - object:setvelocity(vel) - if ent.physical_state then - ent.physical_state = false - ent.object:set_properties({ - physical = false - }) + object:set_velocity(vel) + if not ent.is_magnet_item then + ent.object:set_acceleration({x=0, y=0, z=0}) + ent.is_magnet_item = true minetest.after(magnet_time, afterflight, object, inv, player) @@ -294,7 +316,7 @@ and not minetest.settings:get_bool("creative_mode") then z = z+1 end vel.z = 1 / z - obj:setvelocity(vel) + obj:set_velocity(vel) end end end From 62dbd6bc0da579c8b37c70f3e42a4469a84ebf36 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Sat, 5 Jan 2019 13:26:29 +0100 Subject: [PATCH 62/83] Fix a legacy setting support --- init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index 77b8dde..9481b76 100644 --- a/init.lua +++ b/init.lua @@ -1,5 +1,4 @@ local load_time_start = minetest.get_us_time() -pickup_radius = tonumber(minetest.settings:get("item_pickup_radius")) if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false and minetest.settings:get_bool("enable_item_pickup") ~= false then @@ -9,7 +8,8 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then local pickup_particle = minetest.settings:get_bool("item_drop.pickup_particle") ~= false local pickup_radius = tonumber( - minetest.settings:get("item_drop.pickup_radius")) or 0.75 + minetest.settings:get("item_drop.pickup_radius")) or + tonumber(minetest.settings:get("item_pickup_radius")) or 0.75 local magnet_radius = tonumber( minetest.settings:get("item_drop.magnet_radius")) or -1 local magnet_time = tonumber( From d3687f027a409a90041957d109170a2b1f53714d Mon Sep 17 00:00:00 2001 From: HybridDog Date: Sat, 5 Jan 2019 13:54:12 +0100 Subject: [PATCH 63/83] Add three functions which can be used by other mods --- init.lua | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/init.lua b/init.lua index 9481b76..5e8ac8d 100644 --- a/init.lua +++ b/init.lua @@ -1,5 +1,24 @@ local load_time_start = minetest.get_us_time() +-- Functions which can be overridden by mods +assert(item_drop == nil) +item_drop = { + -- This function is executed before picking up an item or making it fly to + -- the player. If it does not return true, the item is ignored. + -- It is also executed before collecting the item after it flew to + -- the player and did not reach him/her for magnet_time seconds. + can_pickup = function(entity, player) + return true + end, + + -- before_collect and after_collect are executed before and after an item + -- is collected by a player + before_collect = function(entity, pos, player) + end, + after_collect = function(entity, pos, player) + end, +} + if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false and minetest.settings:get_bool("enable_item_pickup") ~= false then local pickup_gain = tonumber( @@ -53,6 +72,7 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then -- adds the item to the inventory and removes the object local function collect_item(ent, pos, player) + item_drop.before_collect(ent, pos, player) minetest.sound_play("item_drop_pickup", { pos = pos, gain = pickup_gain, @@ -94,6 +114,7 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then end end ent:on_punch(player) + item_drop.after_collect(ent, pos, player) end -- opt_get_ent gets the object's luaentity if it can be collected @@ -139,7 +160,8 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then end local item = ItemStack(ent.itemstring) if inv - and inv:room_for_item("main", item) then + and inv:room_for_item("main", item) + and can_pickup(ent, player) then collect_item(ent, object:get_pos(), player) else -- the acceleration will be reset by the object's on_step @@ -224,7 +246,8 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then for i = 1,#objectlist do local object = objectlist[i] local ent = opt_get_ent(object) - if ent then + if ent + and item_drop.can_pickup(ent, player) then if not inv then inv = player:get_inventory() if not inv then @@ -242,10 +265,13 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then flying_item = vector.distance(pos, pos2) > pickup_radius end if not flying_item then - -- collect one item at a time to avoid the loud pop + -- The item is near enough to pick it collect_item(ent, pos, player) + -- Collect one item at a time to avoid the loud pop return true end + -- The item is not too far a way but near enough to be + -- magnetised, make it fly to the player local vel = vector.multiply(vector.subtract(pos, pos2), 3) vel.y = vel.y + 0.6 object:set_velocity(vel) From dd01ddf5ff9c38179d75195fa48c7ecc27af9922 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Fri, 1 Feb 2019 17:55:12 +0100 Subject: [PATCH 64/83] Fix crash when trying to spawn an unknown item --- init.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index 5e8ac8d..6d8db5d 100644 --- a/init.lua +++ b/init.lua @@ -320,8 +320,9 @@ and not minetest.settings:get_bool("creative_mode") then name = item:get_name() end - if name == "" then - -- Sometimes nothing should be dropped + -- Sometimes nothing should be dropped + if name == "" + or not minetest.registered_nodes[name] then count = 0 end From 97158f7facf9f15ff609c241a520633986b0f31d Mon Sep 17 00:00:00 2001 From: HybridDog Date: Tue, 5 Feb 2019 19:29:40 +0100 Subject: [PATCH 65/83] Ignore items where picking failed tested with item_helpers --- init.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/init.lua b/init.lua index 6d8db5d..e437f34 100644 --- a/init.lua +++ b/init.lua @@ -8,6 +8,10 @@ item_drop = { -- It is also executed before collecting the item after it flew to -- the player and did not reach him/her for magnet_time seconds. can_pickup = function(entity, player) + if entity.item_drop_picked then + -- Ignore items where picking has already failed + return false + end return true end, @@ -16,6 +20,7 @@ item_drop = { before_collect = function(entity, pos, player) end, after_collect = function(entity, pos, player) + entity.item_drop_picked = true end, } From 0cee07b9d59c4ff58f94e70874cd1f81736b8cd7 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Tue, 12 Feb 2019 01:12:59 +0100 Subject: [PATCH 66/83] Add setting for disabling manual item pickups by mouse --- README.md | 2 ++ init.lua | 5 +++++ settingtypes.txt | 3 +++ 3 files changed, 10 insertions(+) diff --git a/README.md b/README.md index 5771250..821d3f5 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,8 @@ developed by [PilzAdam](https://github.com/PilzAdam/item_drop). items between these radii are flying to the player for `item_drop.magnet_time` seconds, after this time, they're picked or stop flying. + * Enable manual item pickups by mouse only if `item_drop.mouse_pickup` is + `true` (true by default) * Plays a sound when the items are picked up with the gain level set to `item_drop.pickup_sound_gain` (default 0.2) * Requires a key to be pressed in order to pick items if diff --git a/init.lua b/init.lua index e437f34..3e96094 100644 --- a/init.lua +++ b/init.lua @@ -54,6 +54,11 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then pickup_age = math.min(pickup_age, 0) end end + local mouse_pickup = minetest.settings:get_bool( + "item_drop.mouse_pickup") ~= false + if not mouse_pickup then + minetest.registered_entities["__builtin:item"].pointable = false + end local magnet_mode = magnet_radius > pickup_radius local zero_velocity_mode = pickup_age == -1 diff --git a/settingtypes.txt b/settingtypes.txt index 0bf3684..4896788 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -33,3 +33,6 @@ item_drop.magnet_time (Magnet time) float 5.0 #Time delay in seconds after autopicking an item if it's dropped by a player item_drop.pickup_age (Pickup age) float 0.5 + +#Enable manual item pickups by mouse +item_drop.mouse_pickup (Mouse pickup) bool true From 4c0a23855ae342967766352dd0ac9387ff48b66e Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Tue, 12 Feb 2019 05:37:14 +0100 Subject: [PATCH 67/83] Add a screenshot --- screenshot.png | Bin 0 -> 220961 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 screenshot.png diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..1313e40ed035b590e9ce5b802680117af9b337df GIT binary patch literal 220961 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 Bl-vLS literal 0 HcmV?d00001 From 0aa32c1fed086e535c8182f90cecd797ee395be8 Mon Sep 17 00:00:00 2001 From: texmex Date: Tue, 12 Feb 2019 13:25:34 +0100 Subject: [PATCH 68/83] Remove unneeded variable assertion, fix #20 --- init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/init.lua b/init.lua index 3e96094..bd19bb2 100644 --- a/init.lua +++ b/init.lua @@ -1,7 +1,6 @@ local load_time_start = minetest.get_us_time() -- Functions which can be overridden by mods -assert(item_drop == nil) item_drop = { -- This function is executed before picking up an item or making it fly to -- the player. If it does not return true, the item is ignored. From f8b60b0b05cea3c1ef6f5b2c0ad8ff11d4574ca4 Mon Sep 17 00:00:00 2001 From: tacotexmex Date: Wed, 13 Feb 2019 02:54:58 +0100 Subject: [PATCH 69/83] Update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 821d3f5..7136f76 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ By [PilzAdam](https://github.com/PilzAdam), [texmex](https://github.com/tacotexmex/), [hybriddog](https://github.com/hybriddog/). ## Description -This mod adds Minecraft like drop/pick up of items to Minetest. +A highly configurable mod providing item magnet and in-world node drops ## Licensing LGPLv2.1/CC BY-SA 3.0. Particle code from WCILA mod by Aurailus, originally licensed MIT. From 6637bbb8132e095f3c731843e26b0126d1686d52 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Thu, 16 May 2019 11:36:15 +0200 Subject: [PATCH 70/83] Fix missing ore drops --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.lua b/init.lua index bd19bb2..e263ce5 100644 --- a/init.lua +++ b/init.lua @@ -331,7 +331,7 @@ and not minetest.settings:get_bool("creative_mode") then -- Sometimes nothing should be dropped if name == "" - or not minetest.registered_nodes[name] then + or not minetest.registered_items[name] then count = 0 end From aef629f5b3faa06229cb7a10f3ed740d257535fa Mon Sep 17 00:00:00 2001 From: HybridDog Date: Sun, 26 May 2019 14:13:54 +0200 Subject: [PATCH 71/83] Fix crash due to a missing function I accidentally wrote can_pickup instead of item_drop.can_pickup in a previous commit. --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.lua b/init.lua index e263ce5..da0bca6 100644 --- a/init.lua +++ b/init.lua @@ -170,7 +170,7 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then local item = ItemStack(ent.itemstring) if inv and inv:room_for_item("main", item) - and can_pickup(ent, player) then + and item_drop.can_pickup(ent, player) then collect_item(ent, object:get_pos(), player) else -- the acceleration will be reset by the object's on_step From 765bb0a405bc75eb69c329086435d251cad5cd88 Mon Sep 17 00:00:00 2001 From: texmex Date: Mon, 27 May 2019 09:21:28 +0200 Subject: [PATCH 72/83] Update mod.conf --- mod.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/mod.conf b/mod.conf index 7a095b1..8966913 100644 --- a/mod.conf +++ b/mod.conf @@ -1 +1,2 @@ name = item_drop +description = A highly configurable mod providing item magnet and in-world node drops From 1157ec15df036ab4b6c2a5d85536c4d9bf3811a7 Mon Sep 17 00:00:00 2001 From: texmex Date: Mon, 27 May 2019 09:21:59 +0200 Subject: [PATCH 73/83] Update description.txt --- description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/description.txt b/description.txt index 4488941..ef32f14 100644 --- a/description.txt +++ b/description.txt @@ -1 +1 @@ -This mod adds Minecraft like drop/pick up of items to Minetest. +A highly configurable mod providing item magnet and in-world node drops From 666ff411362d706a28241252a85bf3ca493df6ea Mon Sep 17 00:00:00 2001 From: HybridDog Date: Wed, 29 May 2019 20:44:40 +0200 Subject: [PATCH 74/83] Allow disabling the pickup key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To support lecagy setting names, I added two functions. They use the old setting only if the new one is not set. (I'm not sure if enable_item_pickup_key is a valid legacy setting…) I did not test this commit thoroughly. --- init.lua | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/init.lua b/init.lua index da0bca6..8a30465 100644 --- a/init.lua +++ b/init.lua @@ -23,25 +23,39 @@ item_drop = { end, } -if minetest.settings:get_bool("item_drop.enable_item_pickup") ~= false and -minetest.settings:get_bool("enable_item_pickup") ~= false then - local pickup_gain = tonumber( - minetest.settings:get("item_drop.pickup_sound_gain")) or - tonumber(minetest.settings:get("item_pickup_gain")) or 0.2 +local function legacy_setting_getbool(name_new, name_old, default) + local v = minetest.settings:get_bool(name_new) + if v == nil then + v = minetest.settings:get_bool(name_new) + end + if default then + return v ~= false + end + return v +end + +local function legacy_setting_getnumber(name_new, name_old, default) + return tonumber(minetest.settings:get(name_new)) + or tonumber(minetest.settings:get(name_old)) + or default +end + +if legacy_setting_getbool("item_drop.enable_item_pickup", + "enable_item_pickup", true) then + local pickup_gain = legacy_setting_getnumber("item_drop.pickup_sound_gain", + "item_pickup_gain", 0.2) local pickup_particle = - minetest.settings:get_bool("item_drop.pickup_particle") ~= false - local pickup_radius = tonumber( - minetest.settings:get("item_drop.pickup_radius")) or - tonumber(minetest.settings:get("item_pickup_radius")) or 0.75 + minetest.settings:get_bool("item_drop.pickup_particle", true) + local pickup_radius = legacy_setting_getnumber("item_drop.pickup_radius", + "item_pickup_radius", 0.75) local magnet_radius = tonumber( minetest.settings:get("item_drop.magnet_radius")) or -1 local magnet_time = tonumber( minetest.settings:get("item_drop.magnet_time")) or 5.0 local pickup_age = tonumber( minetest.settings:get("item_drop.pickup_age")) or 0.5 - local key_triggered = minetest.settings:get_bool( - "item_drop.enable_pickup_key") or - minetest.settings:get_bool("enable_item_pickup_key") ~= false + local key_triggered = legacy_setting_getbool("item_drop.enable_pickup_key", + "enable_item_pickup_key", true) local key_invert = minetest.settings:get_bool( "item_drop.pickup_keyinvert") or false local keytype @@ -314,8 +328,7 @@ minetest.settings:get_bool("enable_item_pickup") ~= false then minetest.after(3.0, pickup_step) end -if minetest.settings:get_bool("item_drop.enable_item_drop") ~= false and -minetest.settings:get_bool("enable_item_drop") ~= false +if legacy_setting_getbool("item_drop.enable_item_drop", "enable_item_drop", true) and not minetest.settings:get_bool("creative_mode") then function minetest.handle_node_drops(pos, drops) for i = 1,#drops do From c943cf204268a2c9f7a6d5770b4eeac22e652a4f Mon Sep 17 00:00:00 2001 From: HybridDog Date: Tue, 4 Jun 2019 16:44:46 +0200 Subject: [PATCH 75/83] Enable pickup_keyinvert by default --- README.md | 2 +- init.lua | 2 +- settingtypes.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7136f76..3fa0895 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ developed by [PilzAdam](https://github.com/PilzAdam/item_drop). * Left and Right keys combined (`LeftAndRight`) * Right mouse button (`RMB`) * Sneak key and right mouse button combined (`SneakAndRMB`) - * If `item_drop.pickup_keyinvert` is `true` (false by default), items are + * If `item_drop.pickup_keyinvert` is `true`, items are collected when the key is not pressed instead of when it's pressed. * Displays a particle of the picked item above the player if `item_drop.pickup_particle` is `true` (true by default) diff --git a/init.lua b/init.lua index 8a30465..e89a78e 100644 --- a/init.lua +++ b/init.lua @@ -57,7 +57,7 @@ if legacy_setting_getbool("item_drop.enable_item_pickup", local key_triggered = legacy_setting_getbool("item_drop.enable_pickup_key", "enable_item_pickup_key", true) local key_invert = minetest.settings:get_bool( - "item_drop.pickup_keyinvert") or false + "item_drop.pickup_keyinvert") ~= false local keytype if key_triggered then keytype = minetest.settings:get("item_drop.pickup_keytype") or diff --git a/settingtypes.txt b/settingtypes.txt index 4896788..14df02c 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -8,7 +8,7 @@ item_drop.enable_item_drop (Enable item drops) bool true item_drop.enable_pickup_key (Use pickup key) bool true #Collect items when the key is not pressed instead of when it is pressed -item_drop.pickup_keyinvert (Invert pickup key) bool false +item_drop.pickup_keyinvert (Invert pickup key) bool true #What keytype to use as pickup key item_drop.pickup_keytype (Pickup keytype) enum Use Use,Sneak,LeftAndRight,RMB,SneakAndRMB From faf6d9236d97c5694b9adf308fb7c3d0e5b4b6d1 Mon Sep 17 00:00:00 2001 From: Panquesito7 <51391473+Panquesito7@users.noreply.github.com> Date: Fri, 14 Jun 2019 17:47:21 -0500 Subject: [PATCH 76/83] Replace deprecated functions with newer ones --- init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/init.lua b/init.lua index e89a78e..47b1c6f 100644 --- a/init.lua +++ b/init.lua @@ -145,7 +145,7 @@ if legacy_setting_getbool("item_drop.enable_item_pickup", if zero_velocity_mode then function opt_get_ent(object) if object:is_player() - or not vector.equals(object:getvelocity(), {x=0, y=0, z=0}) then + or not vector.equals(object:get_velocity(), {x=0, y=0, z=0}) then return end local ent = object:get_luaentity() @@ -284,7 +284,7 @@ if legacy_setting_getbool("item_drop.enable_item_pickup", local flying_item local pos2 if magnet_mode then - pos2 = object:getpos() + pos2 = object:get_pos() flying_item = vector.distance(pos, pos2) > pickup_radius end if not flying_item then @@ -354,7 +354,7 @@ and not minetest.settings:get_bool("creative_mode") then error("Couldn't spawn item " .. name .. ", drops: " .. dump(drops)) end - local vel = obj:getvelocity() + local vel = obj:get_velocity() local x = math.random(-5, 4) if x >= 0 then x = x+1 From 871be4048ed4c9d95be64595f4f9074669436b12 Mon Sep 17 00:00:00 2001 From: texmex Date: Sat, 15 Jun 2019 13:26:24 +0200 Subject: [PATCH 77/83] Replace another deprecated function --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.lua b/init.lua index 47b1c6f..16084bd 100644 --- a/init.lua +++ b/init.lua @@ -260,7 +260,7 @@ if legacy_setting_getbool("item_drop.enable_item_pickup", return end - local pos = player:getpos() + local pos = player:get_pos() pos.y = pos.y+0.5 local inv From 682a345495f01645511c567188fde7b4803edeb5 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Mon, 1 Jul 2019 15:37:04 +0200 Subject: [PATCH 78/83] Handle item drops more carefully Do not ignore itemstrings which contain more than just the name; fixes missing clay drops Support dropped items with toolwear and/or metadata --- init.lua | 78 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 22 deletions(-) diff --git a/init.lua b/init.lua index 16084bd..d05726d 100644 --- a/init.lua +++ b/init.lua @@ -330,17 +330,59 @@ end if legacy_setting_getbool("item_drop.enable_item_drop", "enable_item_drop", true) and not minetest.settings:get_bool("creative_mode") then + -- Workaround to test if an item metadata (ItemStackMetaRef) is empty + local function itemmeta_is_empty(meta) + local t = meta:to_table() + for k, v in pairs(t) do + if k ~= "fields" then + return false + end + assert(type(v) == "table") + if next(v) ~= nil then + return false + end + end + return true + end + + -- Tests if the item has special information such as metadata + local function can_split_item(item) + return item:get_wear() == 0 and itemmeta_is_empty(item:get_meta()) + end + + local function spawn_items(pos, items_to_spawn) + for i = 1,#items_to_spawn do + local obj = minetest.add_item(pos, items_to_spawn[i]) + if not obj then + error("Couldn't spawn item " .. name .. ", drops: " + .. dump(drops)) + end + + local vel = obj:get_velocity() + local x = math.random(-5, 4) + if x >= 0 then + x = x+1 + end + vel.x = 1 / x + local z = math.random(-5, 4) + if z >= 0 then + z = z+1 + end + vel.z = 1 / z + obj:set_velocity(vel) + end + end + function minetest.handle_node_drops(pos, drops) for i = 1,#drops do local item = drops[i] - local count, name if type(item) == "string" then - count = 1 - name = item - else - count = item:get_count() - name = item:get_name() + -- The string is not necessarily only the item name, + -- so always convert it to ItemStack + item = ItemStack(item) end + local count = item:get_count() + local name = item:get_name() -- Sometimes nothing should be dropped if name == "" @@ -348,24 +390,16 @@ and not minetest.settings:get_bool("creative_mode") then count = 0 end - for _ = 1,count do - local obj = minetest.add_item(pos, name) - if not obj then - error("Couldn't spawn item " .. name .. ", drops: " .. dump(drops)) + if count > 0 then + -- Split items if possible + local items_to_spawn = {item} + if can_split_item(item) then + for i = 1,count do + items_to_spawn[i] = name + end end - local vel = obj:get_velocity() - local x = math.random(-5, 4) - if x >= 0 then - x = x+1 - end - vel.x = 1 / x - local z = math.random(-5, 4) - if z >= 0 then - z = z+1 - end - vel.z = 1 / z - obj:set_velocity(vel) + spawn_items(pos, items_to_spawn) end end end From 8ef6ba3c0ffdeb47c20d7610680a1be152588827 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Wed, 4 Sep 2019 18:30:49 +0200 Subject: [PATCH 79/83] Do not drop items when a Node Breaker digs a node --- init.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/init.lua b/init.lua index d05726d..25145b1 100644 --- a/init.lua +++ b/init.lua @@ -373,7 +373,13 @@ and not minetest.settings:get_bool("creative_mode") then end end - function minetest.handle_node_drops(pos, drops) + local old_handle_node_drops = minetest.handle_node_drops + function minetest.handle_node_drops(pos, drops, player) + if player.is_fake_player then + -- Node Breaker or similar machines should receive items in the + -- inventory + return old_handle_node_drops(pos, drops, player) + end for i = 1,#drops do local item = drops[i] if type(item) == "string" then From 7cb8086a259c2a66b3920f1e272843c86c9cba6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Wed, 15 Apr 2020 20:21:48 +0200 Subject: [PATCH 80/83] Get player inventory before looping (#30) This prevents the inventory check on each object in the loop and thus shortens the code. Additionally, the inventory existence check is removed because get_inventory never returns nil for player objects. --- init.lua | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/init.lua b/init.lua index 25145b1..bc0fc1a 100644 --- a/init.lua +++ b/init.lua @@ -262,7 +262,7 @@ if legacy_setting_getbool("item_drop.enable_item_pickup", local pos = player:get_pos() pos.y = pos.y+0.5 - local inv + local inv = player:get_inventory() local objectlist = minetest.get_objects_inside_radius(pos, magnet_mode and magnet_radius or pickup_radius) @@ -271,14 +271,6 @@ if legacy_setting_getbool("item_drop.enable_item_pickup", local ent = opt_get_ent(object) if ent and item_drop.can_pickup(ent, player) then - if not inv then - inv = player:get_inventory() - if not inv then - minetest.log("error", "[item_drop] Couldn't " .. - "get inventory") - return - end - end local item = ItemStack(ent.itemstring) if inv:room_for_item("main", item) then local flying_item From 72f4225058e43a1d0a675e3fb18997abac67011d Mon Sep 17 00:00:00 2001 From: HybridDog Date: Fri, 8 May 2020 11:54:31 +0200 Subject: [PATCH 81/83] Support the moveresult parameter of on_step The parameter is available in Minetest 5.3.0-dev. thanks to sofar and VanessaE for the fix and report --- init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/init.lua b/init.lua index bc0fc1a..d589d0f 100644 --- a/init.lua +++ b/init.lua @@ -201,9 +201,9 @@ if legacy_setting_getbool("item_drop.enable_item_pickup", local itemdef = minetest.registered_entities["__builtin:item"] local old_on_step = itemdef.on_step local function do_nothing() end - function itemdef.on_step(self, dtime) + function itemdef.on_step(self, ...) if not self.is_magnet_item then - return old_on_step(self, dtime) + return old_on_step(self, ...) end ObjectRef = ObjectRef or getmetatable(self.object) local old_funcs = {} @@ -212,7 +212,7 @@ if legacy_setting_getbool("item_drop.enable_item_pickup", old_funcs[method] = ObjectRef[method] ObjectRef[method] = do_nothing end - old_on_step(self, dtime) + old_on_step(self, ...) for i = 1, #blocked_methods do local method = blocked_methods[i] ObjectRef[method] = old_funcs[method] From f015cc1631fdbbbf687b708f814e3d0f09fe8a10 Mon Sep 17 00:00:00 2001 From: HybridDog Date: Sun, 17 May 2020 21:12:57 +0200 Subject: [PATCH 82/83] Ignore players which are outside the map --- init.lua | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/init.lua b/init.lua index d589d0f..280504a 100644 --- a/init.lua +++ b/init.lua @@ -252,6 +252,13 @@ if legacy_setting_getbool("item_drop.enable_item_pickup", return keys_pressed ~= key_invert end + local function is_inside_map(pos) + local bound = 31000 + return -bound < pos.x and pos.x < bound + and -bound < pos.y and pos.y < bound + and -bound < pos.z and pos.z < bound + end + -- called for each player to possibly collect an item, returns true if so local function pickupfunc(player) if not has_keys_pressed(player) @@ -261,6 +268,10 @@ if legacy_setting_getbool("item_drop.enable_item_pickup", end local pos = player:get_pos() + if not is_inside_map(pos) then + -- get_objects_inside_radius crashes for too far positions + return + end pos.y = pos.y+0.5 local inv = player:get_inventory() From de38b20fa60c9d567a55bd97e2fa1134cf5d9d5c Mon Sep 17 00:00:00 2001 From: David Leal Date: Mon, 25 May 2020 13:42:09 -0500 Subject: [PATCH 83/83] Add GitHub workflow and LuaCheck (#34) * Add GitHub workflow and LuaCheck * Fix LuaCheck warnings * Improve README.md --- .github/workflows/build.yml | 11 +++++++++++ .luacheckrc | 19 +++++++++++++++++++ README.md | 9 ++++----- init.lua | 2 +- 4 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .luacheckrc diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..980d40a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,11 @@ +on: [push, pull_request] +name: build +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: lint + uses: Roang-zero1/factorio-mod-luacheck@master + with: + luacheckrc_url: https://raw.githubusercontent.com/minetest-mods/item_drop/master/.luacheckrc diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 0000000..a9c034e --- /dev/null +++ b/.luacheckrc @@ -0,0 +1,19 @@ +unused_args = false +allow_defined_top = true +max_line_length = 999 + +ignore = { + "name", "drops", "i", +} + +globals = { + "minetest", +} + +read_globals = { + string = {fields = {"split", "trim"}}, + table = {fields = {"copy", "getn"}}, + + "vector", "ItemStack", + "dump", +} diff --git a/README.md b/README.md index 3fa0895..771e82d 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,14 @@ -# item_drop +# Item Drop [![](https://github.com/minetest-mods/item_drop/workflows/build/badge.svg)](https://github.com/minetest-mods/item_drop/actions) [![License](https://img.shields.io/badge/license-LGPLv2.1%2B-blue.svg)](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html) + +A highly configurable mod providing item magnet and in-world node drops\ By [PilzAdam](https://github.com/PilzAdam), [texmex](https://github.com/tacotexmex/), [hybriddog](https://github.com/hybriddog/). -## Description -A highly configurable mod providing item magnet and in-world node drops - ## Licensing LGPLv2.1/CC BY-SA 3.0. Particle code from WCILA mod by Aurailus, originally licensed MIT. ## Notes -item_drop can be played with Minetest 0.4.16 or above. It was originally +`item_drop` can be played with Minetest 0.4.16 or above. It was originally developed by [PilzAdam](https://github.com/PilzAdam/item_drop). ## List of features diff --git a/init.lua b/init.lua index 280504a..f0d0e00 100644 --- a/init.lua +++ b/init.lua @@ -103,7 +103,7 @@ if legacy_setting_getbool("item_drop.enable_item_pickup", if pickup_particle then local item = minetest.registered_nodes[ ent.itemstring:gsub("(.*)%s.*$", "%1")] - local image = "" + local image if item and item.tiles and item.tiles[1] then if inventorycube_drawtypes[item.drawtype] then local tiles = item.tiles