witt-cd2025/init.lua

184 lines
7.1 KiB
Lua
Raw Normal View History

2017-07-30 16:04:31 -04:00
local player_to_id_text = {} -- Storage of players so the mod knows what huds to update
2017-08-01 11:09:25 -04:00
local player_to_id_mtext = {}
2017-07-30 17:20:44 -04:00
local player_to_id_image = {}
2017-08-01 10:09:44 -04:00
local player_to_cnode = {} -- Get the current looked at node
2017-08-01 10:36:59 -04:00
local player_to_animtime = {} -- For animation
local player_to_animon = {} -- For disabling animation
local player_to_enabled = {}
2017-08-01 10:36:59 -04:00
local ypos = 0.1
2017-07-30 11:15:43 -04:00
2017-07-30 16:04:31 -04:00
minetest.register_globalstep(function(dtime) -- This will run every tick, so around 20 times/second
for _, player in ipairs(minetest:get_connected_players()) do -- Do everything below for each player in-game
if player_to_enabled[player] == nil then player_to_enabled[player] = true end
if not player_to_enabled[player] then return end
2017-07-30 16:04:31 -04:00
local lookat = get_looking_node(player) -- Get the node they're looking at
2017-07-30 11:15:43 -04:00
2017-08-01 10:36:59 -04:00
player_to_animtime[player] = math.min((player_to_animtime[player] or 0.4) + dtime, 0.5)
if player_to_animon[player] then
player:hud_change(player_to_id_text[player], "position", {x = player_to_animtime[player], y = ypos})
2017-08-01 10:59:21 -04:00
player:hud_change(player_to_id_image[player], "position", {x = player_to_animtime[player], y = ypos})
2017-08-01 11:09:25 -04:00
player:hud_change(player_to_id_mtext[player], "position", {x = player_to_animtime[player], y = ypos+0.015})
2017-08-01 10:36:59 -04:00
end
2017-07-30 11:15:43 -04:00
if lookat then
2017-08-01 10:09:44 -04:00
if player_to_cnode[player] ~= lookat.name then
2017-08-01 10:36:59 -04:00
player_to_animtime[player] = nil
2017-08-01 11:09:25 -04:00
local nodename, mod = describe_node(lookat)
player:hud_change(player_to_id_text[player], "text", nodename) -- If they are looking at something, display that
player:hud_change(player_to_id_mtext[player], "text", mod)
2017-08-01 10:09:44 -04:00
local node_object = minetest.registered_nodes[lookat.name]
player:hud_change(player_to_id_image[player], "text", handle_tiles(node_object))
end
player_to_cnode[player] = lookat.name
2017-07-30 11:15:43 -04:00
else
2017-07-30 16:04:31 -04:00
player:hud_change(player_to_id_text[player], "text", "") -- If they are not looking at anything, do not display the text
2017-08-01 11:09:25 -04:00
player:hud_change(player_to_id_mtext[player], "text", "")
2017-08-01 10:09:44 -04:00
player:hud_change(player_to_id_image[player], "text", "")
player_to_cnode[player] = nil
2017-07-30 11:15:43 -04:00
end
2017-08-01 10:09:44 -04:00
2017-07-30 11:15:43 -04:00
end
end)
2017-07-30 16:04:31 -04:00
minetest.register_on_joinplayer(function(player) -- Add the hud to all players
2017-07-30 11:15:43 -04:00
player_to_id_text[player] = player:hud_add({
hud_elem_type = "text",
text = "test",
number = 0xffffff,
2017-08-01 10:59:21 -04:00
alignment = {x = 1, y = 0},
2017-08-01 10:36:59 -04:00
position = {x = 0.5, y = ypos},
2017-07-30 17:20:44 -04:00
})
2017-08-01 11:09:25 -04:00
player_to_id_mtext[player] = player:hud_add({
hud_elem_type = "text",
text = "test",
number = 0x2d62b7,
alignment = {x = 1, y = 0},
position = {x = 0.5, y = ypos+0.015},
})
2017-07-30 17:20:44 -04:00
player_to_id_image[player] = player:hud_add({
hud_elem_type = "image",
text = "",
scale = {x = 1, y = 1},
alignment = 0,
2017-08-01 10:59:21 -04:00
position = {x = 0.5, y = ypos},
offset = {x = -40, y = 0}
2017-07-30 11:15:43 -04:00
})
end)
2017-08-01 10:36:59 -04:00
minetest.register_chatcommand("wanimoff", {
params = "",
description = "Turn WiTT animations off",
func = function(name)
local player = minetest.get_player_by_name(name)
if not player then return false end
player_to_animon[player] = false
return true
end
})
minetest.register_chatcommand("wanimon", {
params = "",
description = "Turn WiTT animations on",
func = function(name)
local player = minetest.get_player_by_name(name)
if not player then return false end
player_to_animon[player] = true
return true
end
})
minetest.register_chatcommand("wittoff", {
params = "",
description = "Turn WiTT off",
func = function(name)
local player = minetest.get_player_by_name(name)
if not player then return false end
player_to_enabled[player] = false
player:hud_change(player_to_id_text[player], "text", "")
2017-08-01 11:09:25 -04:00
player:hud_change(player_to_id_mtext[player], "text", "")
player:hud_change(player_to_id_image[player], "text", "")
player_to_cnode[player] = nil
return true
end
})
minetest.register_chatcommand("witton", {
params = "",
description = "Turn WiTT on",
func = function(name)
local player = minetest.get_player_by_name(name)
if not player then return false end
player_to_enabled[player] = true
return true
end
})
2017-07-30 16:04:31 -04:00
function get_looking_node(player) -- Return the node the given player is looking at or nil
2017-07-30 11:15:43 -04:00
local lookat
for i = 0, 10 do -- 10 is the maximum distance you can point to things in creative mode by default
local lookvector = -- This variable will store what node we might be looking at
vector.add( -- This add function corrects for the players approximate height
vector.add( -- This add function applies the camera's position to the look vector
vector.multiply( -- This multiply function adjusts the distance from the camera by the iteration of the loop we're in
player:get_look_dir(),
i -- Goes from 0 to 10
),
player:get_pos()
),
vector.new(0, 1.5, 0)
)
lookat = minetest.get_node_or_nil( -- This actually gets the node we might be looking at
lookvector
) or lookat
2017-07-30 13:39:04 -04:00
if lookat ~= nil and lookat.name ~= "air" and lookat.name ~= "walking_light:light" then break else lookat = nil end -- If we *are* looking at something, stop the loop and continue
2017-07-30 11:15:43 -04:00
end
return lookat
end
2017-07-30 16:04:31 -04:00
function describe_node(node) -- Return a string that describes the node and mod
local mod, nodename = minetest.registered_nodes[node.name].mod_origin, minetest.registered_nodes[node.name].description
2017-07-30 17:27:06 -04:00
if nodename == "" then
nodename = node.name
end
2017-07-30 11:15:43 -04:00
mod = remove_unneeded(capitalize(mod))
nodename = remove_unneeded(capitalize(nodename))
2017-08-01 11:09:25 -04:00
return nodename, mod
2017-07-30 11:15:43 -04:00
end
2017-07-30 16:04:31 -04:00
function remove_unneeded(str) -- Remove characters like '-' and '_' to make the string look better
2017-07-30 11:15:43 -04:00
return str:gsub("[_-]", " ")
end
2017-07-30 16:04:31 -04:00
function capitalize(str) -- Capitalize every word in a string, looks good for node names
return string.gsub(" "..str, "%W%l", string.upper):sub(2)
2017-07-30 17:20:44 -04:00
end
2017-07-31 14:56:48 -04:00
function handle_tiles(node)
local tiles = node.tiles
2017-07-31 17:20:09 -04:00
if tiles then
for i,v in pairs(tiles) do
if type(v) == "table" then
if tiles[i].name then
tiles[i] = tiles[i].name
else
return ""
end
2017-07-31 14:56:48 -04:00
end
2017-07-30 17:20:44 -04:00
end
2017-07-31 14:56:48 -04:00
2017-07-31 17:20:09 -04:00
if node.drawtype == "normal" or node.drawtype == "allfaces" or node.drawtype == "allfaces_optional" or node.drawtype == "glasslike" or node.drawtype == "glasslike_framed" or node.drawtype == "glasslike_framed_optional" then
if #tiles == 1 then
return minetest.inventorycube(tiles[1], tiles[1], tiles[1])
elseif #tiles == 3 then
return minetest.inventorycube(tiles[1], tiles[3], tiles[3])
elseif #tiles == 6 then
return minetest.inventorycube(tiles[1], tiles[6], tiles[5])
end
2017-07-31 14:56:48 -04:00
end
2017-07-30 17:20:44 -04:00
end
2017-07-31 14:56:48 -04:00
return ""
2017-07-30 11:15:43 -04:00
end