EinsDreiDreiSieben/mods/what_is_this_uwu/help.lua

416 lines
8.1 KiB
Lua
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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