local what_is_this_uwu = { players = {}, players_set = {} } local function split (str, sep) if sep == nil then sep = "%s" end local t = {} for char in string.gmatch(str, "([^"..sep.."]+)") do table.insert(t, char) end return t end local char_width = { A = 12, B = 10, C = 13, D = 12, E = 11, F = 9, G = 13, H = 12, I = 3, J = 9, K = 11, L = 9, M = 13, N = 11, O = 13, P = 10, Q = 13, R = 12, S = 10, T = 11, U = 11, V = 10, W = 15, X = 11, Y = 11, Z = 10, a = 10, b = 8, c = 8, d = 9, e = 9, f = 5, g = 9, h = 9, i = 2, j = 6, k = 8, l = 4, m = 13, n = 8, o = 10, p = 8, q = 10, r = 4, s = 8, t = 5, u = 8, v = 8, w = 12, x = 8, y = 8, z = 8, } char_width[' '] = 5 char_width['_'] = 9 local function is_strange(str) for char in str:gmatch'.' do if char == '' then return true end end return false end local function string_to_pixels(str) local size = 0 str:gsub('.', function(char) local pixels = char_width[char] if pixels then size = size + pixels else size = size + 14 end end) return size end local function inventorycube(img1, img2, img3) if not img1 then return '' end img2 = img2 or img1 img3 = img3 or img1 img1 = img1..'^[resize:16x16' img2 = img2..'^[resize:16x16' img3 = img3..'^[resize:16x16' return "[inventorycube".. "{"..img1:gsub("%^","&").. "{"..img2:gsub("%^","&").. "{"..img3:gsub("%^","&") end local function serialize(val, name, skipnewlines, depth) skipnewlines = skipnewlines or false depth = depth or 0 local tmp = string.rep(' ', depth) if name then tmp = tmp .. name .. ' = ' end if type(val) == 'table' then tmp = tmp .. '{' .. (not skipnewlines and '\n' or '') for k, v in pairs(val) do tmp = tmp .. serialize(v, k, skipnewlines, depth + 1) .. ',' .. (not skipnewlines and '\n' or '') end tmp = tmp .. string.rep(' ', depth) .. '}' elseif type(val) == 'number' then tmp = tmp .. tostring(val) elseif type(val) == 'string' then tmp = tmp .. string.format('%q', val) elseif type(val) == 'boolean' then tmp = tmp .. (val and 'true' or 'false') else tmp = tmp .. '\'[inserializeable datatype:' .. type(val) .. ']\'' end return tmp end function what_is_this_uwu.split_item_name(item_name) local splited = split(item_name, ':') return splited[1], splited[2] end function what_is_this_uwu.destrange(str) local is_strange = is_strange(str); local ignore = true; local temp_str if is_strange then local temp_str = '' local reading = true local is_special = false local between_parenthesis = false for char in str:gmatch'.' do if char == '' then reading = false elseif reading and not between_parenthesis then temp_str = temp_str..char else reading = true end if between_parenthesis then if char == ')' then between_parenthesis = false end else if char == '(' then between_parenthesis = true end end end return temp_str else return str end end function what_is_this_uwu.register_player(player, name) if not what_is_this_uwu.players_set[name] then table.insert(what_is_this_uwu.players, player) what_is_this_uwu.players_set[name] = true end end function what_is_this_uwu.remove_player(name) if what_is_this_uwu.players_set[name] then what_is_this_uwu.players_set[name] = false for i, player in ipairs(what_is_this_uwu.players) do if player == name then table.remove(what_is_this_uwu.players, i) break end end end end function what_is_this_uwu.get_pointed_thing(player) if not what_is_this_uwu.players_set[player:get_player_name()] then return end -- get player position local player_pos = player:get_pos() local eye_height = player:get_properties().eye_height local eye_offset = player:get_eye_offset() player_pos.y = player_pos.y + eye_height player_pos = vector.add(player_pos, eye_offset) -- set liquids vision local see_liquid = minetest.registered_nodes[minetest.get_node(player_pos).name].drawtype ~= 'liquid' -- get wielded item range 5 is engine default -- order tool/item range >> hand_range >> fallback 5 local tool_range = player:get_wielded_item():get_definition().range or nil local hand_range for key, val in pairs(minetest.registered_items) do if key == "" then hand_range = val.range or nil end end local wield_range = tool_range or hand_range or 5 -- determine ray end position local look_dir = player:get_look_dir() look_dir = vector.multiply(look_dir, wield_range) local end_pos = vector.add(look_dir, player_pos) -- get pointed_thing local ray = minetest.raycast(player_pos, end_pos, false, see_liquid) return ray:next() end function what_is_this_uwu.get_node_tiles(node_name) local node = minetest.registered_nodes[node_name] if not node then return 'ignore', 'node', false end if node.groups['not_in_creative_inventory'] then drop = node.drop if drop and type(drop) == 'string' then node_name = drop node = minetest.registered_nodes[drop] if not node then node = minetest.registered_craftitems[drop] end end end if not node or not node.tiles and not node.inventory_image then return 'ignore', 'node', false end local tiles = node.tiles local mod_name, item_name = what_is_this_uwu.split_item_name(node_name) if node.inventory_image:sub(1, 14) == '[inventorycube' then return node.inventory_image..'^[resize:146x146', 'node', minetest.registered_nodes[node_name] elseif node.inventory_image ~= '' then return node.inventory_image..'^[resize:16x16', 'craft_item', minetest.registered_nodes[node_name] else if not tiles[1] then return '', 'node', minetest.registered_nodes[node_name] end tiles[3] = tiles[3] or tiles[1] tiles[6] = tiles[6] or tiles[3] if type(tiles[1]) == 'table' then tiles[1] = tiles[1].name end if type(tiles[3]) == 'table' then tiles[3] = tiles[3].name end if type(tiles[6]) == 'table' then tiles[6] = tiles[6].name end return inventorycube(tiles[1], tiles[6], tiles[3]), 'node', minetest.registered_nodes[node_name] end end function what_is_this_uwu.show_background(player, meta) player:hud_change( meta:get_string('wit:background_left'), 'text', 'left_side.png' ) player:hud_change( meta:get_string('wit:background_middle'), 'text', 'middle.png' ) player:hud_change( meta:get_string('wit:background_right'), 'text', 'right_side.png' ) end function what_is_this_uwu.show(player, meta, form_view, node_description, node_name, item_type, mod_name) if meta:get_string('wit:pointed_thing') == 'ignore' then what_is_this_uwu.show_background(player, meta) end meta:set_string('wit:pointed_thing', node_name) local size if #node_description >= #mod_name then size = string_to_pixels(node_description) else size = string_to_pixels(mod_name) end player:hud_change( meta:get_string('wit:background_middle'), 'scale', {x = size / 16 + 2, y = 2} ) player:hud_change( meta:get_string('wit:background_right'), 'offset', {x = size, y = 35} ) player:hud_change( meta:get_string('wit:image'), 'text', form_view ) player:hud_change( meta:get_string('wit:name'), 'text', node_description ) player:hud_change( meta:get_string('wit:mod'), 'text', mod_name ) if meta:get_string('wit:item_type_in_pointer') ~= item_type then local scale = {} meta:set_string('wit:item_type_in_pointer', item_type) if item_type == 'node' then scale.x = 0.3 scale.y = 0.3 else scale.x = 2.5 scale.y = 2.5 end player:hud_change( meta:get_string('wit:image'), 'scale', scale ) end end function what_is_this_uwu.unshow(player, meta) if not meta then return end meta:set_string('wit:pointed_thing', 'ignore') player:hud_change( meta:get_string('wit:background_left'), 'text', '' ) player:hud_change( meta:get_string('wit:background_middle'), 'text', '' ) player:hud_change( meta:get_string('wit:background_right'), 'text', '' ) player:hud_change( meta:get_string('wit:image'), 'text', '' ) player:hud_change( meta:get_string('wit:name'), 'text', '' ) player:hud_change( meta:get_string('wit:mod'), 'text', '' ) end return what_is_this_uwu