131 lines
3.5 KiB
Lua
131 lines
3.5 KiB
Lua
local FORMSPEC_NAME = "pick_and_place:handle_node"
|
|
|
|
-- returns the absolute positions and name for the handle
|
|
-- TODO: a better name perhaps?
|
|
function pick_and_place.get_template_data_from_handle(pos, meta)
|
|
-- relative positions
|
|
local rel_pos1 = minetest.string_to_pos(meta:get_string("pos1"))
|
|
local rel_pos2 = minetest.string_to_pos(meta:get_string("pos2"))
|
|
local name = meta:get_string("name")
|
|
local id = meta:get_string("id")
|
|
if id == "" then
|
|
id = pick_and_place.create_id()
|
|
end
|
|
|
|
if not rel_pos1 or not rel_pos2 then
|
|
-- not configured
|
|
return
|
|
end
|
|
|
|
-- absolute positions
|
|
local pos1 = vector.add(pos, rel_pos1)
|
|
local pos2 = vector.add(pos, rel_pos2)
|
|
|
|
return pos1, pos2, name, id
|
|
end
|
|
|
|
function pick_and_place.get_handle_infotext(meta)
|
|
return "Handle name: '" .. meta:get_string("name") .. "' id: '" .. meta:get_string("id") .. "'"
|
|
end
|
|
|
|
-- migrate
|
|
local function migrate_handle(pos, meta)
|
|
if meta:get_string("id") == "" then
|
|
-- legacy node without id, reconfigure
|
|
local pos1, pos2, name, id = pick_and_place.get_template_data_from_handle(pos, meta)
|
|
pick_and_place.configure(pos1, pos2, name, id)
|
|
meta:set_string("infotext", pick_and_place.get_handle_infotext(meta))
|
|
end
|
|
end
|
|
|
|
local function on_punch(pos, _, puncher)
|
|
local itemstack = puncher:get_wielded_item()
|
|
|
|
if not itemstack:is_empty() then
|
|
-- not an empty hand
|
|
return
|
|
end
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
migrate_handle(pos, meta)
|
|
|
|
local pos1, pos2, name, id = pick_and_place.get_template_data_from_handle(pos, meta)
|
|
if not pos1 or not pos2 then
|
|
return
|
|
end
|
|
|
|
itemstack = pick_and_place.create_tool(pos1, pos2, name, id)
|
|
puncher:set_wielded_item(itemstack)
|
|
end
|
|
|
|
|
|
local function get_formspec(meta)
|
|
return [[
|
|
size[10,1]
|
|
real_coordinates[true]
|
|
field[0.1,0.1;7,0.8;name;Name;]] .. meta:get_string("name") .. [[]
|
|
button_exit[7.1,0.1;2.5,0.8;save;Save]
|
|
]]
|
|
end
|
|
|
|
-- playername -> node position for formspec
|
|
local fs_pos = {}
|
|
|
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
if formname ~= FORMSPEC_NAME then
|
|
return false
|
|
end
|
|
|
|
if not fields.save and not fields.key_enter_field then
|
|
return true
|
|
end
|
|
|
|
local playername = player:get_player_name()
|
|
local pos = fs_pos[playername]
|
|
if not pos then
|
|
return true
|
|
end
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
local pos1, pos2, _, id = pick_and_place.get_template_data_from_handle(pos, meta)
|
|
|
|
-- reconfigure handles
|
|
pick_and_place.configure(pos1, pos2, fields.name, id)
|
|
|
|
return true
|
|
end)
|
|
|
|
minetest.register_node("pick_and_place:handle", {
|
|
description = "Pick and place handle",
|
|
tiles = {"pick_and_place.png"},
|
|
drawtype = "allfaces",
|
|
use_texture_alpha = "blend",
|
|
paramtype = "light",
|
|
sunlight_propagates = true,
|
|
on_rightclick = function(pos, _, clicker)
|
|
local meta = minetest.get_meta(pos)
|
|
local playername = clicker:get_player_name()
|
|
fs_pos[playername] = pos
|
|
minetest.show_formspec(playername, FORMSPEC_NAME, get_formspec(meta))
|
|
end,
|
|
on_punch = on_punch,
|
|
on_destruct = pick_and_place.remove_handles,
|
|
drop = "",
|
|
groups = {
|
|
oddly_breakable_by_hand = 3,
|
|
not_in_creative_inventory = 1
|
|
}
|
|
})
|
|
|
|
minetest.register_lbm({
|
|
label = "register pick-and-place handles",
|
|
name = "pick_and_place:handle_register",
|
|
nodenames = {"pick_and_place:handle"},
|
|
run_at_every_load = true,
|
|
action = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
migrate_handle(pos, meta)
|
|
local pos1, pos2, name, id = pick_and_place.get_template_data_from_handle(pos, meta)
|
|
pick_and_place.register_template(pos1, pos2, name, id)
|
|
end
|
|
}) |