From 31e8c9b0ccbb4e50eac9af76577bafa209a5345f Mon Sep 17 00:00:00 2001 From: Hybrid Dog Date: Wed, 6 Sep 2017 13:27:21 +0200 Subject: [PATCH 01/35] 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 02/35] 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 03/35] 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 04/35] 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 05/35] 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 06/35] 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 07/35] 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 08/35] 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 09/35] 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 10/35] 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 11/35] 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 12/35] 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 13/35] 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 14/35] 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 15/35] 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 16/35] 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 17/35] 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 18/35] 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 19/35] 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 20/35] 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 21/35] 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 22/35] 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 23/35] 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 24/35] 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 25/35] 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 26/35] 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 27/35] 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 28/35] 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 29/35] 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 30/35] 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 31/35] 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 32/35] 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 33/35] 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 34/35] 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 35/35] 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)