forked from minetest-mods/technic
fix crash in constructor
This commit is contained in:
parent
c5a2f0facc
commit
018b248d51
@ -1,6 +1,77 @@
|
|||||||
|
|
||||||
local S = technic.getter
|
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({
|
minetest.register_craft({
|
||||||
type = "shapeless",
|
type = "shapeless",
|
||||||
output = 'technic:constructor_mk1_off 1',
|
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,
|
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
|
|
||||||
|
Loading…
Reference in New Issue
Block a user