diff --git a/technic/machines/other/constructor.lua b/technic/machines/other/constructor.lua index 1210c5b..b330b15 100644 --- a/technic/machines/other/constructor.lua +++ b/technic/machines/other/constructor.lua @@ -1,6 +1,77 @@ local S = technic.getter +local function deploy_node(inv, slot_name, pos1, node1, node) + if node1.name == "air" then + if not inv:is_empty(slot_name) then + stack1=inv:get_list(slot_name) + local def = stack1[1]:get_definition() + if def.type == "node" then + node_to_be_placed={name=stack1[1]:get_name(), param1=0, param2=node.param2} + minetest.set_node(pos1,node_to_be_placed) + stack1[1]:take_item() + inv:set_stack(slot_name, 1, stack1[1]) + elseif def.type == "craft" then + if def.on_place then + -- print("deploy_node: item has on_place. trying...") + local ok, stk = pcall(def.on_place, stack1[1], nil, { + -- Fake pointed_thing + type = "node", + above = pos1, + under = { x=pos1.x, y=pos1.y-1, z=pos1.z }, + }) + if ok then + -- print("deploy_node: on_place succeeded!") + inv:set_stack(slot_name, 1, stk or stack1[1]) + return + -- else + -- print("deploy_node: WARNING: error while running on_place: "..tostring(stk)) + end + end + minetest.item_place_object(stack1[1], nil, { + -- Fake pointed_thing + type = "node", + above = pos1, + under = pos1, + }) + inv:set_stack(slot_name, 1, nil) + end + end + return + end + if node1.name == "ignore" or + node1.name == "default:lava_source" or + node1.name == "default:lava_flowing" or + node1.name == "default:water_source" or + node1.name == "default:water_flowing" + then return end + if inv:room_for_item(slot_name,node1) then + local def = minetest.registered_nodes[node1.name] + if not def then return end + local drop = def.drop or node1.name + if type(drop) == "table" then + local pr = PseudoRandom(math.random()) + local c = 0 + local loop = 0 -- Prevent infinite loop + while (c < (drop.max_items or 1)) and (loop < 1000) do + local i = math.floor(pr:next(1, #drop.items)) + if pr:next(1, drop.items[i].rarity or 1) == 1 then + for _,item in ipairs(drop.items[i].items) do + inv:add_item(slot_name,item) + end + c = c + 1 + end + loop = loop + 1 + end + minetest.remove_node(pos1) + elseif type(drop) == "string" then + inv:add_item(slot_name,drop) + minetest.remove_node(pos1) + end + end + +end + minetest.register_craft({ type = "shapeless", output = 'technic:constructor_mk1_off 1', @@ -288,74 +359,3 @@ minetest.register_node("technic:constructor_mk3_on", { allow_metadata_inventory_move = technic.machine_inventory_move, }) - -local function deploy_node(inv, slot_name, pos1, node1, node) - if node1.name == "air" then - if not inv:is_empty(slot_name) then - stack1=inv:get_list(slot_name) - local def = stack1[1]:get_definition() - if def.type == "node" then - node_to_be_placed={name=stack1[1]:get_name(), param1=0, param2=node.param2} - minetest.set_node(pos1,node_to_be_placed) - stack1[1]:take_item() - inv:set_stack(slot_name, 1, stack1[1]) - elseif def.type == "craft" then - if def.on_place then - -- print("deploy_node: item has on_place. trying...") - local ok, stk = pcall(def.on_place, stack1[1], nil, { - -- Fake pointed_thing - type = "node", - above = pos1, - under = { x=pos1.x, y=pos1.y-1, z=pos1.z }, - }) - if ok then - -- print("deploy_node: on_place succeeded!") - inv:set_stack(slot_name, 1, stk or stack1[1]) - return - -- else - -- print("deploy_node: WARNING: error while running on_place: "..tostring(stk)) - end - end - minetest.item_place_object(stack1[1], nil, { - -- Fake pointed_thing - type = "node", - above = pos1, - under = pos1, - }) - inv:set_stack(slot_name, 1, nil) - end - end - return - end - if node1.name == "ignore" or - node1.name == "default:lava_source" or - node1.name == "default:lava_flowing" or - node1.name == "default:water_source" or - node1.name == "default:water_flowing" - then return end - if inv:room_for_item(slot_name,node1) then - local def = minetest.registered_nodes[node1.name] - if not def then return end - local drop = def.drop or node1.name - if type(drop) == "table" then - local pr = PseudoRandom(math.random()) - local c = 0 - local loop = 0 -- Prevent infinite loop - while (c < (drop.max_items or 1)) and (loop < 1000) do - local i = math.floor(pr:next(1, #drop.items)) - if pr:next(1, drop.items[i].rarity or 1) == 1 then - for _,item in ipairs(drop.items[i].items) do - inv:add_item(slot_name,item) - end - c = c + 1 - end - loop = loop + 1 - end - minetest.remove_node(pos1) - elseif type(drop) == "string" then - inv:add_item(slot_name,drop) - minetest.remove_node(pos1) - end - end - -end