Move item drop to builtin

This commit is contained in:
stujones11 2019-05-19 21:26:13 +01:00 committed by Maksim
parent c1acb73c80
commit 05f58b3a04
4 changed files with 26 additions and 125 deletions

View File

@ -449,12 +449,19 @@ function core.item_drop(itemstack, dropper, pos)
local obj = core.add_item(p, item) local obj = core.add_item(p, item)
if obj then if obj then
if dropper_is_player then if dropper_is_player then
local vel = dropper:get_player_velocity()
local dir = dropper:get_look_dir() local dir = dropper:get_look_dir()
dir.x = dir.x * 2.9 dir.x = vel.x + dir.x * 4
dir.y = dir.y * 2.9 + 2 dir.y = vel.y + dir.y * 4 + 2
dir.z = dir.z * 2.9 dir.z = vel.z + dir.z * 4
obj:set_velocity(dir) obj:set_velocity(dir)
obj:get_luaentity().dropped_by = dropper:get_player_name() obj:get_luaentity().dropped_by = dropper:get_player_name()
else
obj:set_velocity({
x = math.random(-2.5, 2.5),
y = math.random(1, 4),
z = math.random(-2.5, 2.5)
})
end end
return itemstack return itemstack
end end
@ -514,7 +521,7 @@ function core.handle_node_drops(pos, drops, digger)
-- Add dropped items to object's inventory -- Add dropped items to object's inventory
local inv = digger and digger:get_inventory() local inv = digger and digger:get_inventory()
local give_item local give_item
if inv then if inv and core.settings:get_bool("creative_mode") then
give_item = function(item) give_item = function(item)
return inv:add_item("main", item) return inv:add_item("main", item)
end end
@ -528,12 +535,7 @@ function core.handle_node_drops(pos, drops, digger)
for _, dropped_item in pairs(drops) do for _, dropped_item in pairs(drops) do
local left = give_item(dropped_item) local left = give_item(dropped_item)
if not left:is_empty() then if not left:is_empty() then
local p = { core.item_drop(left, nil, pos)
x = pos.x + math.random()/2-0.25,
y = pos.y + math.random()/2-0.25,
z = pos.z + math.random()/2-0.25,
}
core.add_item(p, left)
end end
end end
end end

View File

@ -75,69 +75,3 @@ minetest.register_globalstep(function()
end end
player_iter = nil player_iter = nil
end) end)
--Drop items on dig
--This only works in survival
if minetest.setting_getbool("creative_mode") == false then
function minetest.handle_node_drops(pos, drops)
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 _ = 1, count do
local obj = minetest.add_item(pos, name)
if obj ~= nil then
obj:get_luaentity().collect = true
obj:get_luaentity().age = 0
obj:setvelocity({
x = math.random(-3, 3),
y = math.random(2, 5),
z = math.random(-3, 3)
})
end
end
end
end
end
--Throw items using player's velocity
function minetest.item_drop(itemstack, dropper, pos)
--if player then do modified item drop
if dropper and minetest.get_player_information(dropper:get_player_name()) then
local v = dropper:get_look_dir()
local vel = dropper:get_player_velocity()
local p = {x=pos.x, y=pos.y+player_collect_height, z=pos.z}
local item = itemstack:to_string()
local obj = core.add_item(p, item)
if obj then
v.x = (v.x*5)+vel.x
v.y = ((v.y*5)+2)+vel.y
v.z = (v.z*5)+vel.z
obj:setvelocity(v)
obj:get_luaentity().dropped_by = dropper:get_player_name()
itemstack:clear()
return itemstack
end
--machine
else
local v = dropper:get_look_dir()
local item = itemstack:to_string()
local obj = minetest.add_item({x=pos.x,y=pos.y+1.5,z=pos.z}, item) --{x=pos.x+v.x,y=pos.y+v.y+1.5,z=pos.z+v.z}
if obj then
v.x = (v.x*5)
v.y = (v.y*5)
v.z = (v.z*5)
obj:setvelocity(v)
obj:get_luaentity().dropped_by = nil
itemstack:clear()
return itemstack
end
end
end

View File

@ -1,28 +1,9 @@
local show_armor = minetest.get_modpath("3d_armor") local show_armor = minetest.get_modpath("3d_armor")
local function item_drop(itemstack, dropper, pos)
if dropper:is_player() then
local v = dropper:get_look_dir()
local p = {x=pos.x, y=pos.y+1.2, z=pos.z}
p.x = p.x+(math.random(1,3)*0.2)
p.z = p.z+(math.random(1,3)*0.2)
local obj = minetest.add_item(p, itemstack)
if obj then
v.x = v.x*4
v.y = v.y*4 + 2
v.z = v.z*4
obj:setvelocity(v)
end
else
minetest.add_item(pos, itemstack)
end
return itemstack
end
local function drop_fields(player, name) local function drop_fields(player, name)
local inv = player:get_inventory() local inv = player:get_inventory()
for i,stack in ipairs(inv:get_list(name)) do for i,stack in ipairs(inv:get_list(name)) do
item_drop(stack, player, player:get_pos()) minetest.item_drop(stack, player, player:get_pos())
stack:clear() stack:clear()
inv:set_stack(name, i, stack) inv:set_stack(name, i, stack)
end end

View File

@ -140,34 +140,6 @@ local split_inv = minetest.create_detached_inventory("split", {
}) })
split_inv:set_size("main", 1) split_inv:set_size("main", 1)
local function item_drop(itemstack, dropper, pos)
if dropper:is_player() then
local v = dropper:get_look_dir()
local p = {x=pos.x, y=pos.y+1.2, z=pos.z}
p.x = p.x+(math.random(1,3)*0.2)
p.z = p.z+(math.random(1,3)*0.2)
local obj = minetest.add_item(p, itemstack)
if obj then
v.x = v.x*4
v.y = v.y*4 + 2
v.z = v.z*4
obj:setvelocity(v)
end
else
minetest.add_item(pos, itemstack)
end
return itemstack
end
local function drop_fields(player, name)
local inv = player:get_inventory()
for i,stack in ipairs(inv:get_list(name)) do
item_drop(stack, player, player:get_pos())
stack:clear()
inv:set_stack(name, i, stack)
end
end
function workbench:set_formspec(meta, id) function workbench:set_formspec(meta, id)
meta:set_string("formspec", "size[9,8.75;]".. meta:set_string("formspec", "size[9,8.75;]"..
"background[-0.2,-0.26;9.41,9.49;formspec_inventory.png]" .. "background[-0.2,-0.26;9.41,9.49;formspec_inventory.png]" ..
@ -297,7 +269,19 @@ minetest.register_node("workbench:workbench", {
on_metadata_inventory_put = workbench.on_put, on_metadata_inventory_put = workbench.on_put,
on_metadata_inventory_take = workbench.on_take, on_metadata_inventory_take = workbench.on_take,
allow_metadata_inventory_put = workbench.put, allow_metadata_inventory_put = workbench.put,
allow_metadata_inventory_move = workbench.move allow_metadata_inventory_move = workbench.move,
on_receive_fields = function(pos, formname, fields, sender)
if fields.quit and pos and sender then
local inv = sender:get_inventory()
if inv then
for i, stack in ipairs(inv:get_list("craft")) do
minetest.item_drop(stack, nil, pos)
stack:clear()
inv:set_stack("craft", i, stack)
end
end
end
end,
}) })
minetest.register_tool("workbench:hammer", { minetest.register_tool("workbench:hammer", {