191 lines
5.6 KiB
Lua
191 lines
5.6 KiB
Lua
-- Label
|
|
|
|
local S = minetest.get_translator("rp_label")
|
|
|
|
rp_label = {}
|
|
|
|
-- Maximum length of the name of a named node (e.g. with label)
|
|
local NAMED_NODE_MAX_TEXT_LENGTH = 40
|
|
|
|
local mod_mobs = minetest.get_modpath("rp_mobs") ~= nil
|
|
|
|
local form_label = ""
|
|
form_label = form_label .. rp_formspec.default.version
|
|
form_label = form_label .. "size[8.5,4.5]"
|
|
form_label = form_label .. rp_formspec.default.boilerplate
|
|
form_label = form_label .. "background[0,0;8.5,4.5;ui_formspec_bg_short.png]"
|
|
form_label = form_label .. rp_formspec.button_exit(2.75, 3, 3, 1, "", minetest.formspec_escape(S("Give name")), false)
|
|
rp_formspec.register_page("rp_label:label", form_label)
|
|
|
|
-- Remembers which thing (pos or object) a player is currently about to give a label to.
|
|
-- * Key: player name
|
|
-- * Value: {
|
|
-- ttype = "pos" or "object", -- thing type
|
|
-- thing = -- <position vector> or an <ObjectRef>
|
|
-- }
|
|
local active_things = {}
|
|
|
|
rp_label.container_label_formspec_element = function(meta)
|
|
local name = meta:get_string("name")
|
|
local form = ""
|
|
if name ~= "" then
|
|
form = form .. "background9[0.5,-0.5;7,0.5;ui_formspec_bg_label_extension.png;false;15,15,-15,-1]"
|
|
form = form .. "style_type[label;noclip=true;textcolor=#000000FF]"
|
|
form = form .. "label[0.7,-0.25;"..minetest.formspec_escape(name).."]"
|
|
end
|
|
return form
|
|
end
|
|
|
|
local restrict_text = function(text)
|
|
-- Discard everything after the first newline or carriage return
|
|
local tsplit = string.split(text, "\n", nil, 1)
|
|
if #tsplit >= 1 then
|
|
text = tsplit[1]
|
|
end
|
|
tsplit = string.split(text, "\r", nil, 1)
|
|
if #tsplit >= 1 then
|
|
text = tsplit[1]
|
|
end
|
|
|
|
-- Limit text length
|
|
text = string.sub(text, 1, NAMED_NODE_MAX_TEXT_LENGTH)
|
|
|
|
return text
|
|
end
|
|
|
|
-- Assign a name to a node
|
|
rp_label.write_name = function(pos, text)
|
|
text = restrict_text(text)
|
|
|
|
local node = minetest.get_node(pos)
|
|
local def
|
|
if minetest.registered_nodes[node.name] then
|
|
def = minetest.registered_nodes[node.name]
|
|
end
|
|
|
|
if def and def._rp_write_name ~= nil then
|
|
def._rp_write_name(pos, text)
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
local write = function(itemstack, player, pointed_thing)
|
|
if pointed_thing.type == "object" then
|
|
if not mod_mobs then
|
|
return itemstack
|
|
end
|
|
local obj = pointed_thing.ref
|
|
local lua = obj:get_luaentity()
|
|
if lua and lua._cmi_is_mob then
|
|
local text = rp_mobs.get_nametag(lua)
|
|
|
|
local form = rp_formspec.get_page("rp_label:label")
|
|
form = form .. "field[1,1.5;6.5,0.5;text;;"..minetest.formspec_escape(text).."]"
|
|
form = form .. "set_focus[text;true]"
|
|
|
|
minetest.show_formspec(player:get_player_name(), "rp_label:label", form)
|
|
|
|
active_things[player:get_player_name()] = { ttype = "object", thing = obj }
|
|
end
|
|
return itemstack
|
|
end
|
|
if pointed_thing.type ~= "node" then
|
|
return itemstack
|
|
end
|
|
-- Handle pointed node handlers and protection
|
|
if util.handle_node_protection(player, pointed_thing) then
|
|
return itemstack
|
|
end
|
|
|
|
local node = minetest.get_node(pointed_thing.under)
|
|
local def = minetest.registered_nodes[node.name]
|
|
|
|
if def._rp_write_name then
|
|
local meta = minetest.get_meta(pointed_thing.under)
|
|
local text = meta:get_string("name")
|
|
|
|
local form = rp_formspec.get_page("rp_label:label")
|
|
form = form .. "field[1,1.5;6.5,0.5;text;;"..minetest.formspec_escape(text).."]"
|
|
form = form .. "set_focus[text;true]"
|
|
|
|
active_things[player:get_player_name()] = { ttype = "pos", thing = table.copy(pointed_thing.under) }
|
|
|
|
minetest.show_formspec(player:get_player_name(), "rp_label:label", form)
|
|
end
|
|
return itemstack
|
|
end
|
|
|
|
minetest.register_craftitem(
|
|
"rp_label:label",
|
|
{
|
|
description = S("Label and Graphite"),
|
|
_tt_help = S("Give a name to a container or creature"),
|
|
inventory_image = "rp_label_label.png",
|
|
wield_image = "rp_label_label.png",
|
|
on_use = write,
|
|
groups = { tool = 1 },
|
|
})
|
|
|
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
local pname = player:get_player_name()
|
|
if formname ~= "rp_label:label" then
|
|
-- Reset temp vars
|
|
active_things[pname] = nil
|
|
return
|
|
end
|
|
if fields.text then
|
|
-- Player must wield label
|
|
local witem = player:get_wielded_item()
|
|
local named = false
|
|
if witem:get_name() ~= "rp_label:label" then
|
|
return
|
|
end
|
|
local thing = active_things[pname]
|
|
if thing and thing.ttype == "pos" then
|
|
local pos = thing.thing
|
|
rp_label.write_name(pos, fields.text)
|
|
named = true
|
|
elseif mod_mobs and thing and thing.ttype == "object" then
|
|
local obj = thing.thing
|
|
if obj then
|
|
local lua = obj:get_luaentity()
|
|
if lua and lua._cmi_is_mob then
|
|
local text = restrict_text(fields.text)
|
|
rp_mobs.set_nametag(lua, text)
|
|
named = true
|
|
end
|
|
end
|
|
end
|
|
if named then
|
|
-- Reset temp vars
|
|
active_things[pname] = nil
|
|
|
|
-- Use up label item after writing
|
|
if not minetest.is_creative_enabled(pname) then
|
|
witem:take_item()
|
|
player:set_wielded_item(witem)
|
|
end
|
|
end
|
|
elseif fields.quit then
|
|
active_things[pname] = nil
|
|
end
|
|
end)
|
|
|
|
minetest.register_on_leaveplayer(function(player)
|
|
active_things[player:get_player_name()] = nil
|
|
end)
|
|
|
|
|
|
-- Crafting
|
|
if minetest.get_modpath("rp_default") ~= nil then
|
|
crafting.register_craft({
|
|
output = "rp_label:label 20",
|
|
items = {
|
|
"rp_default:sheet_graphite",
|
|
"rp_default:paper",
|
|
}
|
|
})
|
|
end
|
|
|