2024-02-27 07:05:30 +01:00

138 lines
3.4 KiB
Lua

local has_default = minetest.get_modpath("default")
local has_pipeworks = minetest.get_modpath("pipeworks")
local has_vizlib = minetest.get_modpath("vizlib")
local formspec = "size[8,9.2;]" ..
"list[context;main;0,0;8,4;]" ..
"field[1.3,4.6;4.25,1;channel;Digiline Channel;${channel}]" ..
"button_exit[5,4.28;2,1;set_channel;Set]" ..
"list[current_player;main;0,5.4;8,4;]" ..
"listring[]"
minetest.register_node("digibuilder:digibuilder", {
description = "Digibuilder",
tiles = {"digibuilder.png"},
tube = {
insert_object = function(pos, _, stack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv:add_item("main", stack)
end,
can_insert = function(pos, _, stack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
stack = stack:peek_item(1)
return inv:room_for_item("main", stack)
end,
input_inventory = "main",
connect_sides = {
left = 1, back = 1, top = 1,
right = 1, front = 1, bottom = 1
}
},
light_source = 13,
groups = {
cracky = 3,
oddly_breakable_by_hand = 3,
tubedevice = 1,
tubedevice_receiver = 1
},
is_ground_content = false,
sounds = has_default and default.node_sound_glass_defaults(),
digiline = {
receptor = {
rules = digibuilder.digiline_rules,
action = function() end
},
effector = {
rules = digibuilder.digiline_rules,
action = digibuilder.digiline_effector
}
},
after_place_node = function(pos, placer)
local meta = minetest.get_meta(pos)
-- set owner
local owner = placer:get_player_name() or ""
meta:set_string("owner", owner)
if has_pipeworks then
pipeworks.after_place(pos)
end
end,
on_construct = function(pos)
-- inventory
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("main", 8*4)
-- metadata
meta:set_string("formspec", formspec)
meta:set_string("channel", "digibuilder")
meta:set_string("infotext", "Digibuilder")
end,
can_dig = function(pos,player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local name = player:get_player_name()
return inv:is_empty("main") and not minetest.is_protected(pos, name)
end,
after_dig_node = has_pipeworks and pipeworks.after_dig or nil,
on_receive_fields = function(pos, _, fields, sender)
if not sender or minetest.is_protected(pos, sender:get_player_name()) then
return
end
if fields.set_channel then
local meta = minetest.get_meta(pos)
meta:set_string("channel", fields.channel)
end
if fields.digiline_channel then
-- Update old formspec
local meta = minetest.get_meta(pos)
meta:set_string("formspec", formspec)
end
end,
-- inventory protection
allow_metadata_inventory_take = function(pos, _, _, stack, player)
if player and player:is_player() and minetest.is_protected(pos, player:get_player_name()) then
-- protected
return 0
end
return stack:get_count()
end,
allow_metadata_inventory_put = function(pos, _, _, stack, player)
if player and player:is_player() and minetest.is_protected(pos, player:get_player_name()) then
-- protected
return 0
end
return stack:get_count()
end,
on_punch = has_vizlib and function(pos, _, player)
if not player or player:get_wielded_item():get_name() ~= "" then
-- Only show area when using an empty hand
return
end
vizlib.draw_cube(pos, digibuilder.max_radius + 0.5, {player = player})
end or nil,
})