From: oilboi <47129783+oilboi@users.noreply.github.com> Date: Fri, 21 Feb 2020 16:55:17 +0000 (-0500) Subject: Improve item magnet X-Git-Tag: Alpha-0.04~602 X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=777f73f0ad0747c25ba3e6de3e5b6cdbcb6093fd;p=Crafter.git Improve item magnet --- diff --git a/mods/hand/init.lua b/mods/hand/init.lua index cc8372e..034c0df 100644 --- a/mods/hand/init.lua +++ b/mods/hand/init.lua @@ -20,7 +20,6 @@ minetest.register_item(":", { } }) - -- This is a fake node that should never be placed in the world local def = minetest.registered_items[""] minetest.register_node("hand:player", { diff --git a/mods/itemhandling/init.lua b/mods/itemhandling/init.lua index 6456c23..2754cfe 100644 --- a/mods/itemhandling/init.lua +++ b/mods/itemhandling/init.lua @@ -1,3 +1,12 @@ +collection = {} +collection.collection_height = 0.5 -- the height of the collection based off the player's origin y height +collection.magnet_radius = 2 -- the radius of the item magnet +collection.allow_lower = false -- false = items below origin y of player will not be collected --true = player will collect all objects in radius --false = minecraft style --true = pilzadam style +collection.collection_time = 2.5 --the time which the item will be collected + +local path = minetest.get_modpath("itemhandling") +dofile(path.."/magnet.lua") + --handle node drops function minetest.handle_node_drops(pos, drops, digger) for _,item in ipairs(drops) do @@ -21,7 +30,7 @@ function minetest.handle_node_drops(pos, drops, digger) end end end - + -- Minetest: builtin/item_entity.lua @@ -85,10 +94,13 @@ minetest.register_entity(":__builtin:item", { force_out_start = nil, --Collection Variables collection_timer = 0, + collection_timer_goal = collection.collection_time, + collection_height = collection.collection_height, collectable = false, try_timer = 0, collected = false, delete_timer = 0, + radius = collection.magnet_radius, set_item = function(self, item) local stack = ItemStack(item or self.itemstring) @@ -181,20 +193,50 @@ minetest.register_entity(":__builtin:item", { end, on_step = function(self, dtime) + --if item set to be collected then only execute go to player if self.collected == true then - self.object:setvelocity(vector.new(0,0,0)) - self.object:setacceleration(vector.new(0,0,0)) - - self.delete_timer = self.delete_timer + dtime - --this is where the item gets removed from world - if self.delete_timer > 0.1 then + if not self.collector then + self.collected = false + print("throwing exception") + return + end + local collector = minetest.get_player_by_name(self.collector) + if collector then + self.object:setacceleration(vector.new(0,0,0)) + self.disable_physics(self) + --get the variables + local pos = self.object:getpos() + local pos2 = collector:getpos() + pos2.y = pos2.y + self.collection_height + + + + + local direction = vector.normalize(vector.subtract(pos2,pos)) + local distance = vector.distance(pos2,pos) + local multiplier = (self.radius*5) - distance + local velocity = vector.multiply(direction,multiplier) + self.object:setvelocity(velocity) + + if distance < 0.2 then + self.object:remove() + end + + + --self.delete_timer = self.delete_timer + dtime + --this is where the item gets removed from world + --if self.delete_timer > 1 then + -- self.object:remove() + --end + return + else + print(self.collector.." does not exist") self.object:remove() end - return end - + --allow entity to be collected after timer - if self.collectable == false and self.collection_timer >= 2.5 then + if self.collectable == false and self.collection_timer >= self.collection_timer_goal then self.collectable = true elseif self.collectable == false then self.collection_timer = self.collection_timer + dtime @@ -327,35 +369,3 @@ minetest.register_entity(":__builtin:item", { end end, }) - - ---The item collection magnet ---Item collection -local eye_height = 1.1 -minetest.register_globalstep(function(dtime) - --collection - for _,player in ipairs(minetest.get_connected_players()) do - --don't magnetize to dead players - if player:get_hp() > 0 then - local pos = player:getpos() - local inv = player:get_inventory() - --radial detection - for _,object in ipairs(minetest.get_objects_inside_radius({x=pos.x,y=pos.y+eye_height,z=pos.z}, 3)) 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 - if object:get_luaentity().collectable == true and object:get_luaentity().collected == false then - minetest.sound_play("pickup", { - to_player = player, - gain = 0.4, - pitch = math.random(60,100)/100 - }) - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - object:moveto({x=pos.x,y=pos.y+eye_height,z=pos.z,continuous=true}) - object:get_luaentity().collected = true - end - end - end - end - end - end -end) diff --git a/mods/itemhandling/magnet.lua b/mods/itemhandling/magnet.lua new file mode 100644 index 0000000..aa992e3 --- /dev/null +++ b/mods/itemhandling/magnet.lua @@ -0,0 +1,38 @@ +--The item collection magnet +--Item collection +minetest.register_globalstep(function(dtime) + --collection + for _,player in ipairs(minetest.get_connected_players()) do + --don't magnetize to dead players + if player:get_hp() > 0 then + local pos = player:getpos() + local inv = player:get_inventory() + --radial detection + for _,object in ipairs(minetest.get_objects_inside_radius({x=pos.x,y=pos.y+collection.collection_height,z=pos.z}, collection.magnet_radius)) do + local pos2 = object:getpos() + if (collection.allow_lower == false and vector.subtract(pos2,pos).y >= 0) or collection.allow_lower == true then + + 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 + + if object:get_luaentity().collectable == true and object:get_luaentity().collected == false then + minetest.sound_play("pickup", { + to_player = player, + gain = 0.4, + pitch = math.random(60,100)/100 + }) + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + object:get_luaentity().collector = player:get_player_name() + object:get_luaentity().collected = true + -- print("Set flag at item: "..dump(object:getpos())) + --object:moveto({x=pos.x,y=pos.y+eye_height,z=pos.z,continuous=true}) + + end + end + end + end + end + end + end +end)