mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-09-12 08:42:10 +02:00
Implement custom item dropper handlers, implement droppers placing minecarts
This commit is contained in:
parent
af9409c69f
commit
52bca90ae2
@ -850,6 +850,19 @@ function mcl_minecarts.place_minecart(itemstack, pointed_thing, placer)
|
|||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function dropper_place_minecart(dropitem, pos)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local nodedef = minetest.registered_nodes[node.name]
|
||||||
|
|
||||||
|
-- Don't try to place the minecart if pos isn't a rail
|
||||||
|
if (nodedef.groups.rail or 0) == 0 then return false end
|
||||||
|
|
||||||
|
mcl_minecarts.place_minecart(dropitem, {
|
||||||
|
above = pos,
|
||||||
|
under = vector.offset(pos,0,-1,0)
|
||||||
|
})
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
local function register_craftitem(itemstring, entity_id, description, tt_help, longdesc, usagehelp, icon, creative)
|
local function register_craftitem(itemstring, entity_id, description, tt_help, longdesc, usagehelp, icon, creative)
|
||||||
entity_mapping[itemstring] = entity_id
|
entity_mapping[itemstring] = entity_id
|
||||||
@ -860,6 +873,7 @@ local function register_craftitem(itemstring, entity_id, description, tt_help, l
|
|||||||
end
|
end
|
||||||
local def = {
|
local def = {
|
||||||
stack_max = 1,
|
stack_max = 1,
|
||||||
|
_mcl_dropper_on_drop = dropper_place_minecart,
|
||||||
on_place = function(itemstack, placer, pointed_thing)
|
on_place = function(itemstack, placer, pointed_thing)
|
||||||
if not pointed_thing.type == "node" then
|
if not pointed_thing.type == "node" then
|
||||||
return
|
return
|
||||||
|
@ -129,9 +129,9 @@ local dropperdef = {
|
|||||||
-- If they are containers - double down as hopper
|
-- If they are containers - double down as hopper
|
||||||
mcl_util.hopper_push(pos, droppos)
|
mcl_util.hopper_push(pos, droppos)
|
||||||
end
|
end
|
||||||
if dropnodedef.walkable then
|
if dropnodedef.walkable then return end
|
||||||
return
|
|
||||||
end
|
-- Build a list of items in the dropper
|
||||||
local stacks = {}
|
local stacks = {}
|
||||||
for i = 1, inv:get_size("main") do
|
for i = 1, inv:get_size("main") do
|
||||||
local stack = inv:get_stack("main", i)
|
local stack = inv:get_stack("main", i)
|
||||||
@ -139,12 +139,32 @@ local dropperdef = {
|
|||||||
table.insert(stacks, { stack = stack, stackpos = i })
|
table.insert(stacks, { stack = stack, stackpos = i })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Pick an item to drop
|
||||||
|
local dropitem = nil
|
||||||
|
local stack = nil
|
||||||
|
local r = nil
|
||||||
if #stacks >= 1 then
|
if #stacks >= 1 then
|
||||||
local r = math.random(1, #stacks)
|
r = math.random(1, #stacks)
|
||||||
local stack = stacks[r].stack
|
stack = stacks[r].stack
|
||||||
local dropitem = ItemStack(stack)
|
dropitem = ItemStack(stack)
|
||||||
dropitem:set_count(1)
|
dropitem:set_count(1)
|
||||||
local stack_id = stacks[r].stackpos
|
end
|
||||||
|
if not dropitem then return end
|
||||||
|
|
||||||
|
-- Flag for if the item was dropped. If true the item will be removed from
|
||||||
|
-- the inventory after dropping
|
||||||
|
local item_dropped = false
|
||||||
|
|
||||||
|
-- Check if the drop item has a custom handler
|
||||||
|
local itemdef = minetest.registered_craftitems[dropitem:get_name()]
|
||||||
|
if itemdef._mcl_dropper_on_drop then
|
||||||
|
item_dropped = itemdef._mcl_dropper_on_drop(dropitem, droppos)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- If a custom handler wasn't successful then drop the item as an entity
|
||||||
|
if not item_dropped then
|
||||||
|
-- Drop as entity
|
||||||
local pos_variation = 100
|
local pos_variation = 100
|
||||||
droppos = vector.offset(droppos,
|
droppos = vector.offset(droppos,
|
||||||
math.random(-pos_variation, pos_variation) / 1000,
|
math.random(-pos_variation, pos_variation) / 1000,
|
||||||
@ -156,6 +176,12 @@ local dropperdef = {
|
|||||||
local speed = 3
|
local speed = 3
|
||||||
item_entity:set_velocity(vector.multiply(drop_vel, speed))
|
item_entity:set_velocity(vector.multiply(drop_vel, speed))
|
||||||
stack:take_item()
|
stack:take_item()
|
||||||
|
item_dropped = trie
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Remove dropped items from inventory
|
||||||
|
if item_dropped then
|
||||||
|
local stack_id = stacks[r].stackpos
|
||||||
inv:set_stack("main", stack_id, stack)
|
inv:set_stack("main", stack_id, stack)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
Loading…
Reference in New Issue
Block a user