2021-05-28 00:34:58 +02:00
local S = minetest.get_translator ( minetest.get_current_modname ( ) )
2017-03-18 01:00:20 +01:00
2021-05-29 16:12:33 +02:00
local mod_doc_basics = minetest.get_modpath ( " doc_basics " )
2017-03-18 01:00:20 +01:00
local doc_identifier = { }
doc_identifier.registered_objects = { }
-- API
doc.sub . identifier = { }
2021-05-28 00:34:58 +02:00
function doc . sub . identifier . register_object ( object_name , category_id , entry_id )
2017-03-18 01:00:20 +01:00
doc_identifier.registered_objects [ object_name ] = { category = category_id , entry = entry_id }
end
-- END OF API
2021-05-28 00:34:58 +02:00
function doc_identifier . identify ( itemstack , user , pointed_thing )
2017-03-18 01:00:20 +01:00
local username = user : get_player_name ( )
2021-05-28 00:34:58 +02:00
local function show_message ( username , itype , param )
2017-03-18 01:00:20 +01:00
local vsize = 2
local message
if itype == " error_item " then
message = S ( " No help entry for this item could be found. " )
elseif itype == " error_node " then
message = S ( " No help entry for this block could be found. " )
elseif itype == " error_unknown " then
2019-03-18 13:20:17 +01:00
vsize = vsize + 2
2017-03-18 01:00:20 +01:00
local mod
2021-05-29 16:12:33 +02:00
if param then
2017-03-18 01:00:20 +01:00
local colon = string.find ( param , " : " )
2021-05-29 16:12:33 +02:00
if colon and colon > 1 then
2017-03-18 01:00:20 +01:00
mod = string.sub ( param , 1 , colon - 1 )
end
end
2019-03-18 13:20:17 +01:00
message = S ( " Error: This node, item or object is undefined. This is always an error. " ) .. " \n " ..
S ( " This can happen for the following reasons: " ) .. " \n " ..
S ( " • The mod which is required for it is not enabled " ) .. " \n " ..
S ( " • The author of the game or a mod has made a mistake " )
2017-03-18 01:00:20 +01:00
message = message .. " \n \n "
2021-05-29 16:12:33 +02:00
if mod then
if minetest.get_modpath ( mod ) then
2019-03-18 13:20:17 +01:00
message = message .. S ( " It appears to originate from the mod “@1”, which is enabled. " , mod )
2017-03-18 01:00:20 +01:00
message = message .. " \n "
else
2019-03-18 13:20:17 +01:00
message = message .. S ( " It appears to originate from the mod “@1”, which is not enabled! " , mod )
2017-03-18 01:00:20 +01:00
message = message .. " \n "
end
end
2021-05-29 16:12:33 +02:00
if param then
2019-03-18 13:20:17 +01:00
message = message .. S ( " Its identifier is “@1”. " , param )
2017-03-18 01:00:20 +01:00
end
elseif itype == " error_ignore " then
message = S ( " This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds. " )
elseif itype == " error_object " or itype == " error_unknown_thing " then
message = S ( " No help entry for this object could be found. " )
elseif itype == " player " then
message = S ( " This is a player. " )
end
minetest.show_formspec (
username ,
" doc_identifier:error_missing_item_info " ,
2019-03-18 13:20:17 +01:00
" size[10, " .. vsize .. " ;] " ..
" textarea[0.5,0.2;10, " .. ( vsize - 0.2 ) .. " ;;; " .. minetest.formspec_escape ( message ) .. " ] " ..
" button_exit[3.75, " .. ( - 0.5 + vsize ) .. " ;3,1;okay; " .. minetest.formspec_escape ( S ( " OK " ) ) .. " ] "
2017-03-18 01:00:20 +01:00
)
end
if pointed_thing.type == " node " then
local pos = pointed_thing.under
local node = minetest.get_node ( pos )
2021-05-29 16:12:33 +02:00
if minetest.registered_nodes [ node.name ] then
2021-04-16 13:35:03 +02:00
--local nodedef = minetest.registered_nodes[node.name]
2017-03-18 01:00:20 +01:00
if ( node.name == " ignore " ) then
show_message ( username , " error_ignore " )
elseif doc.entry_exists ( " nodes " , node.name ) then
doc.show_entry ( username , " nodes " , node.name , true )
else
show_message ( username , " error_node " )
end
else
show_message ( username , " error_unknown " , node.name )
end
elseif pointed_thing.type == " object " then
local object = pointed_thing.ref
local le = object : get_luaentity ( )
if object : is_player ( ) then
2021-05-29 16:12:33 +02:00
if mod_doc_basics and doc.entry_exists ( " basics " , " players " ) then
2017-03-18 01:00:20 +01:00
doc.show_entry ( username , " basics " , " players " , true )
else
-- Fallback message
show_message ( username , " player " )
end
-- luaentity exists
2021-05-29 16:12:33 +02:00
elseif le then
2017-03-18 01:00:20 +01:00
local ro = doc_identifier.registered_objects [ le.name ]
-- Dropped items
if le.name == " __builtin:item " then
local itemstring = ItemStack ( minetest.deserialize ( le : get_staticdata ( ) ) . itemstring ) : get_name ( )
if doc.entry_exists ( " nodes " , itemstring ) then
doc.show_entry ( username , " nodes " , itemstring , true )
elseif doc.entry_exists ( " tools " , itemstring ) then
doc.show_entry ( username , " tools " , itemstring , true )
elseif doc.entry_exists ( " craftitems " , itemstring ) then
doc.show_entry ( username , " craftitems " , itemstring , true )
elseif minetest.registered_items [ itemstring ] == nil or itemstring == " unknown " then
show_message ( username , " error_unknown " , itemstring )
else
show_message ( username , " error_item " )
end
-- Falling nodes
elseif le.name == " __builtin:falling_node " then
local itemstring = minetest.deserialize ( le : get_staticdata ( ) ) . name
if doc.entry_exists ( " nodes " , itemstring ) then
doc.show_entry ( username , " nodes " , itemstring , true )
end
-- A known registered object
2021-05-29 16:12:33 +02:00
elseif ro then
2017-03-18 01:00:20 +01:00
doc.show_entry ( username , ro.category , ro.entry , true )
-- Undefined object (error)
elseif minetest.registered_entities [ le.name ] == nil then
show_message ( username , " error_unknown " , le.name )
-- Other object (undocumented)
else
show_message ( username , " error_object " )
end
else
--show_message(username, "error_object")
show_message ( username , " error_unknown " )
end
elseif pointed_thing.type ~= " nothing " then
show_message ( username , " error_unknown_thing " )
end
return itemstack
end
function doc_identifier . solid_mode ( itemstack , user , pointed_thing )
2017-07-24 20:16:47 +02:00
-- Use pointed node's on_rightclick function first, if present
if pointed_thing.type == " node " then
local node = minetest.get_node ( pointed_thing.under )
if user and not user : get_player_control ( ) . sneak then
if minetest.registered_nodes [ node.name ] and minetest.registered_nodes [ node.name ] . on_rightclick then
return minetest.registered_nodes [ node.name ] . on_rightclick ( pointed_thing.under , node , user , itemstack ) or itemstack
end
end
end
2017-03-18 01:00:20 +01:00
return ItemStack ( " doc_identifier:identifier_solid " )
end
function doc_identifier . liquid_mode ( itemstack , user , pointed_thing )
2017-07-24 20:16:47 +02:00
-- Use pointed node's on_rightclick function first, if present
if pointed_thing.type == " node " then
local node = minetest.get_node ( pointed_thing.under )
2018-03-27 15:08:31 +02:00
if user and not user : get_player_control ( ) . sneak then
2017-07-24 20:16:47 +02:00
if minetest.registered_nodes [ node.name ] and minetest.registered_nodes [ node.name ] . on_rightclick then
return minetest.registered_nodes [ node.name ] . on_rightclick ( pointed_thing.under , node , user , itemstack ) or itemstack
end
end
end
2017-03-18 01:00:20 +01:00
return ItemStack ( " doc_identifier:identifier_liquid " )
end
minetest.register_tool ( " doc_identifier:identifier_solid " , {
2017-03-18 01:19:15 +01:00
description = S ( " Lookup Tool " ) ,
2020-02-19 04:54:17 +01:00
_tt_help = S ( " Show help for pointed thing " ) ,
2017-03-18 01:00:20 +01:00
_doc_items_longdesc = S ( " This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used. " ) ,
2019-03-18 13:20:17 +01:00
_doc_items_usagehelp = S ( " Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case. " ) ,
2017-03-18 01:00:20 +01:00
_doc_items_hidden = false ,
tool_capabilities = { } ,
range = 10 ,
wield_image = " doc_identifier_identifier.png " ,
inventory_image = " doc_identifier_identifier.png " ,
liquids_pointable = false ,
on_use = doc_identifier.identify ,
on_place = doc_identifier.liquid_mode ,
on_secondary_use = doc_identifier.liquid_mode ,
} )
minetest.register_tool ( " doc_identifier:identifier_liquid " , {
2017-03-18 01:19:15 +01:00
description = S ( " Lookup Tool " ) ,
2017-03-18 01:00:20 +01:00
_doc_items_create_entry = false ,
tool_capabilities = { } ,
range = 10 ,
2019-03-18 13:20:17 +01:00
groups = { not_in_creative_inventory = 1 , not_in_craft_guide = 1 , disable_repair = 1 } ,
2017-03-18 01:00:20 +01:00
wield_image = " doc_identifier_identifier_liquid.png " ,
inventory_image = " doc_identifier_identifier_liquid.png " ,
liquids_pointable = true ,
on_use = doc_identifier.identify ,
on_place = doc_identifier.solid_mode ,
on_secondary_use = doc_identifier.solid_mode ,
} )
2018-03-27 15:08:31 +02:00
minetest.register_craft ( {
output = " doc_identifier:identifier_solid " ,
recipe = { { " group:stick " , " group:stick " } ,
{ " " , " group:stick " } ,
{ " group:stick " , " " } }
} )
2017-03-18 01:00:20 +01:00
2021-05-29 16:12:33 +02:00
if minetest.get_modpath ( " mcl_core " ) then
2017-03-18 01:00:20 +01:00
minetest.register_craft ( {
output = " doc_identifier:identifier_solid " ,
2021-04-16 13:35:03 +02:00
recipe = { { " mcl_core:glass " } ,
2018-03-27 15:08:31 +02:00
{ " group:stick " } }
2017-03-18 01:00:20 +01:00
} )
end
minetest.register_alias ( " doc_identifier:identifier " , " doc_identifier:identifier_solid " )
doc.add_entry_alias ( " tools " , " doc_identifier:identifier_solid " , " tools " , " doc_identifier:identifier_liquid " )