|
|
|
local ipairs
|
|
|
|
= ipairs
|
|
|
|
|
|
|
|
local minetest, vector
|
|
|
|
= minetest, vector
|
|
|
|
|
|
|
|
local rotate = include("rotate")
|
|
|
|
|
|
|
|
local TEX_ROTATE_CLOCKWISE = "nc_extended_rotating_hud_rotate_clockwise.png"
|
|
|
|
local TEX_ROTATE_COUNTER_CLOCKWISE = "nc_extended_rotating_hud_rotate_counter_clockwise.png"
|
|
|
|
|
|
|
|
local player_huds = {}
|
|
|
|
|
|
|
|
local function do_player_rotating_checks(player)
|
|
|
|
local name = player:get_player_name()
|
|
|
|
|
|
|
|
local hud_index = player_huds[name]
|
|
|
|
if hud_index then
|
|
|
|
-- FIXME: Only remove / update HUD elements when necessary.
|
|
|
|
player:hud_remove(hud_index)
|
|
|
|
player_huds[name] = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
local look_dir = player:get_look_dir()
|
|
|
|
local player_pos = vector.copy(player:get_pos())
|
|
|
|
local eye_offset = vector.divide(player:get_eye_offset(), 10)
|
|
|
|
local eye_height = player:get_properties().eye_height;
|
|
|
|
local eye_pos = player_pos + eye_offset + vector.new(0, eye_height, 0)
|
|
|
|
|
|
|
|
local default_reach = minetest.registered_items[""].range or 4
|
|
|
|
local wielded_reach = player:get_wielded_item():get_definition().reach
|
|
|
|
local reach = wielded_reach or default_reach
|
|
|
|
|
|
|
|
local node = nil
|
|
|
|
local ray = minetest.raycast(eye_pos, eye_pos + look_dir * reach, false, false)
|
|
|
|
for pointed_thing in ray do
|
|
|
|
if pointed_thing.type == "node" then
|
|
|
|
node = minetest.get_node(pointed_thing.under)
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if node and rotate.is_rotatable(node) then
|
|
|
|
local is_sneaking = player:get_player_control().sneak
|
|
|
|
local texture = is_sneaking and TEX_ROTATE_COUNTER_CLOCKWISE or TEX_ROTATE_CLOCKWISE
|
|
|
|
hud_index = player:hud_add({
|
|
|
|
hud_elem_type = "image",
|
|
|
|
name = "rotation hint",
|
|
|
|
text = texture,
|
|
|
|
position = { x = 0.5, y = 0.5 },
|
|
|
|
offset = { x = 0, y = 0 },
|
|
|
|
alignment = { x = 0, y = 0 },
|
|
|
|
scale = { x = 1, y = 1 },
|
|
|
|
})
|
|
|
|
player_huds[name] = hud_index
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
minetest.register_globalstep(function(delta_time)
|
|
|
|
for _, player in ipairs(minetest.get_connected_players()) do
|
|
|
|
do_player_rotating_checks(player)
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
|
|
minetest.register_on_leaveplayer(function(player)
|
|
|
|
local name = player:get_player_name()
|
|
|
|
player_huds[name] = nil
|
|
|
|
end)
|