178 lines
No EOL
5.5 KiB
Lua
178 lines
No EOL
5.5 KiB
Lua
-- Function to get formspec string
|
|
local function get_formspec(item)
|
|
-- Set item info string
|
|
local iteminfo = [[
|
|
box[1,2.75;6,0.001;#00000099]
|
|
hypertext[2.3,3.15;4,1.5;;<global halign=center>(place item above to set focus)]
|
|
]]
|
|
if item then
|
|
local description = minetest.registered_items[item] and minetest.registered_items[item].description:split("\n")[1]
|
|
local groups = researcher.registered_items[item] and (function()
|
|
local str = ""
|
|
local grouplist = {}
|
|
for group,_ in pairs(researcher.registered_items[item].groups) do
|
|
table.insert(grouplist,group)
|
|
end
|
|
table.sort(grouplist)
|
|
return table.concat(grouplist,", ")
|
|
end)()
|
|
iteminfo = string.format([[
|
|
box[1,2.75;6,0.001;#00000099]
|
|
hypertext[2.3,3;4,0.5;;<global halign=center size=24><b>%s</b>]
|
|
hypertext[2.3,3.35;4,1.5;;<global halign=center size=18>%s]
|
|
]],
|
|
description or "???",
|
|
groups or "(groups unknown)")
|
|
end
|
|
|
|
return string.format([[
|
|
size[8,9.1]
|
|
box[0,0;7.8,5;#00000040]
|
|
|
|
image[3.1,0.575;2,2;researcher_research_inventory_decor_%s.png]
|
|
list[context;focus;3.5,1;1,1;0]
|
|
listring[current_player;main]
|
|
listring[context;focus]
|
|
|
|
%s
|
|
|
|
image[0,5.2;1,1;researcher_gui_hb_bg.png]
|
|
image[1,5.2;1,1;researcher_gui_hb_bg.png]
|
|
image[2,5.2;1,1;researcher_gui_hb_bg.png]
|
|
image[3,5.2;1,1;researcher_gui_hb_bg.png]
|
|
image[4,5.2;1,1;researcher_gui_hb_bg.png]
|
|
image[5,5.2;1,1;researcher_gui_hb_bg.png]
|
|
image[6,5.2;1,1;researcher_gui_hb_bg.png]
|
|
image[7,5.2;1,1;researcher_gui_hb_bg.png]
|
|
list[current_player;main;0,5.2;8,1;]
|
|
list[current_player;main;0,6.35;8,3;8]
|
|
]],
|
|
item and "active" or "inactive",
|
|
iteminfo)
|
|
end
|
|
|
|
-- Function for refreshing infotext when node meta inventory changes
|
|
local function update_metadata(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local item = meta:get_inventory():get_stack("focus",1)
|
|
if item and not item:is_empty() then
|
|
local iname = item:get_name()
|
|
item = minetest.registered_items[iname]
|
|
description = ""
|
|
if item and item.description then
|
|
meta:set_string("infotext","Research Table: " .. item.description:split("\n")[1])
|
|
end
|
|
meta:set_string("formspec",get_formspec(iname))
|
|
else
|
|
meta:set_string("formspec",get_formspec(nil))
|
|
meta:set_string("infotext","Research Table")
|
|
end
|
|
end
|
|
|
|
-- Register research table node
|
|
minetest.register_node("researcher:research_table",{
|
|
-- Node definition fields
|
|
description = "Research Table",
|
|
short_description = "Research Table",
|
|
drawtype = "mesh",
|
|
mesh = "research_table.obj",
|
|
tiles = {
|
|
{ name = "researcher_research_table_frame.png" },
|
|
{ name = "researcher_research_table_surface.png" },
|
|
},
|
|
paramtype2 = "4dir",
|
|
stack_max = 1,
|
|
sounds = (function()
|
|
if researcher.dependencies.default then
|
|
return default.node_sound_wood_defaults()
|
|
elseif researcher.dependencies.mcl_sounds then
|
|
return mcl_sounds.node_sound_wood_defaults()
|
|
else
|
|
return nil -- no specific sounds
|
|
end
|
|
end)(),
|
|
|
|
-- Set research table groups
|
|
groups = {
|
|
oddly_breakable_by_hand = 1,
|
|
},
|
|
|
|
-- Initialize research table data
|
|
on_construct = function(pos)
|
|
-- Set inventory size
|
|
local meta = minetest.get_meta(pos)
|
|
local inventory = meta:get_inventory()
|
|
inventory:set_size("focus", 1)
|
|
|
|
-- Set infotext
|
|
meta:set_string("infotext","Research Table")
|
|
|
|
-- Set meta formspec
|
|
meta:set_string("formspec",get_formspec(nil))
|
|
end,
|
|
|
|
-- Drop inventory contents when destroyed
|
|
on_destruct = function(pos)
|
|
local item = minetest.get_meta(pos):get_inventory():get_stack("focus",1)
|
|
if item and not item:is_empty() then
|
|
minetest.add_item(pos,item)
|
|
end
|
|
end,
|
|
|
|
-- Update infotext when inventory changes
|
|
on_metadata_inventory_move = update_metadata,
|
|
on_metadata_inventory_take = update_metadata,
|
|
on_metadata_inventory_put = update_metadata,
|
|
})
|
|
|
|
-- Register research table crafting recipe
|
|
minetest.register_craft({
|
|
output = "researcher:research_table",
|
|
recipe = {
|
|
{"group:stone", "group:stone", "group:stone"},
|
|
{"group:wood", "group:wood", "group:wood"},
|
|
{"group:wood", "", "group:wood"},
|
|
},
|
|
})
|
|
|
|
-- Register ABM for activation particles
|
|
minetest.register_abm({
|
|
label = "Researcher: Research Table Activation Particles",
|
|
nodenames = {"researcher:research_table"},
|
|
interval = 4,
|
|
chance = 1,
|
|
catch_up = false,
|
|
action = function(pos)
|
|
-- Do nothing if research table is empty
|
|
if minetest.get_meta(pos):get_inventory():get_stack("focus",1):is_empty() then
|
|
return
|
|
end
|
|
|
|
-- Show item particles to nearby players
|
|
local radius = researcher.settings.research_table_player_radius
|
|
for object in minetest.objects_in_area(pos:add(-2),pos:add(2)) do
|
|
if object:is_player() then
|
|
minetest.add_particlespawner({
|
|
playername = object:get_player_name(),
|
|
amount = 16,
|
|
time = 4,
|
|
pos = {
|
|
min = pos:add(vector.new(-0.6,0,-0.6)),
|
|
max = pos:add(vector.new(0.6,0,0.6)),
|
|
},
|
|
minsize = 1,
|
|
maxsize = 1.5,
|
|
minvel = { x = 0, y = 0.05, z = 0 },
|
|
maxvel = { x = 0, y = 0.1, z = 0 },
|
|
minacc = { x = 0, y = 0.1, z = 0 },
|
|
maxacc = { x = 0, y = 0.2, z = 0 },
|
|
minexptime = 4.5,
|
|
maxexptime = 3,
|
|
texture = "plus.png^[colorize:#ffff77^[opacity:180",
|
|
glow = 14,
|
|
collisiondetection = false,
|
|
})
|
|
end
|
|
end
|
|
end,
|
|
}) |