show icon, better chat message
This commit is contained in:
parent
dcfd8dfd33
commit
39f742c311
50
init.lua
50
init.lua
@ -1,9 +1,10 @@
|
|||||||
-- TODO show some text on screen for a short while?
|
-- TODO show some text on screen for a short while?
|
||||||
-- TODO "admin" command version with configurable pos, radius and timeout
|
-- TODO "admin" command version with configurable pos, radius and timeout
|
||||||
|
|
||||||
local announce_command_name = "look!"
|
local announce_command_name = "look"
|
||||||
local announce_radius = 256
|
local announce_radius = 256
|
||||||
local announce_timeout = 20
|
local announce_icon = "exclamation_mark.png"
|
||||||
|
local announce_timeout = 10
|
||||||
local waypoint_precision = 1 -- set to 1 to show whole number or 10 for 1 decimal
|
local waypoint_precision = 1 -- set to 1 to show whole number or 10 for 1 decimal
|
||||||
local waypoint_color = 0xFFFFFF
|
local waypoint_color = 0xFFFFFF
|
||||||
local point_range = 180
|
local point_range = 180
|
||||||
@ -20,9 +21,9 @@ local function raycast_crosshair(player, range)
|
|||||||
local pointed_thing = ray:next()
|
local pointed_thing = ray:next()
|
||||||
while pointed_thing do
|
while pointed_thing do
|
||||||
if pointed_thing.type == "object" and pointed_thing.ref == player then
|
if pointed_thing.type == "object" and pointed_thing.ref == player then
|
||||||
|
-- exclude the player themselves from the raycast
|
||||||
pointed_thing = ray:next()
|
pointed_thing = ray:next()
|
||||||
else
|
else
|
||||||
print("pointed_thing.type", pointed_thing.type)
|
|
||||||
return pointed_thing
|
return pointed_thing
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -43,34 +44,51 @@ local function get_pointed_position(player, range)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function show_hud_waypoint(player, point_pos, name)
|
local function show_hud_waypoint(player, point_pos, name, icon_name)
|
||||||
local hud_id = player:hud_add({
|
local hud_id1 = player:hud_add({
|
||||||
hud_elem_type = "waypoint",
|
hud_elem_type = "waypoint",
|
||||||
name = name,
|
name = name,
|
||||||
text = "m", -- distance suffix
|
text = "m", -- distance suffix
|
||||||
precision = waypoint_precision,
|
precision = waypoint_precision,
|
||||||
number = waypoint_color,
|
number = waypoint_color,
|
||||||
world_pos = point_pos,
|
world_pos = point_pos,
|
||||||
|
offset = {x=0,y=0},
|
||||||
|
alignment = {x=0, y=1},
|
||||||
})
|
})
|
||||||
return hud_id
|
|
||||||
|
local hud_id2 = player:hud_add({
|
||||||
|
hud_elem_type = "image_waypoint",
|
||||||
|
scale = {x=-3,y=-3},
|
||||||
|
text = icon_name,
|
||||||
|
alignment = {x=0,y=-1},
|
||||||
|
world_pos = point_pos,
|
||||||
|
offset = {x=0,y=0},
|
||||||
|
--name = name,
|
||||||
|
--precision = waypoint_precision,
|
||||||
|
--number = waypoint_color,
|
||||||
|
})
|
||||||
|
local hud_ids = {hud_id1, hud_id2}
|
||||||
|
return hud_ids
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function hide_hud_waypoint(player_name, hud_id)
|
local function hide_hud_waypoint(player_name, hud_ids)
|
||||||
local player = minetest.get_player_by_name(player_name)
|
local player = minetest.get_player_by_name(player_name)
|
||||||
if player then
|
if player then
|
||||||
player:hud_remove(hud_id)
|
for _,hud_id in pairs(hud_ids) do
|
||||||
|
player:hud_remove(hud_id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function add_announcement(announcer, pos, radius, point_pos, name, timeout)
|
local function add_announcement(announcer, pos, radius, point_pos, name, icon_name, timeout)
|
||||||
for i, object in pairs(minetest.get_objects_inside_radius(pos, radius)) do
|
for i, object in pairs(minetest.get_objects_inside_radius(pos, radius)) do
|
||||||
if object:is_player() then
|
if object:is_player() then
|
||||||
local player = object
|
local player = object
|
||||||
local player_name = player:get_player_name()
|
local player_name = player:get_player_name()
|
||||||
local hud_id = show_hud_waypoint(player, point_pos, name)
|
local hud_ids = show_hud_waypoint(player, point_pos, name, icon_name)
|
||||||
minetest.after(announce_timeout, hide_hud_waypoint, player_name, hud_id)
|
minetest.after(announce_timeout, hide_hud_waypoint, player_name, hud_ids)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -84,6 +102,7 @@ minetest.register_chatcommand(announce_command_name, {
|
|||||||
local player = minetest.get_player_by_name(name)
|
local player = minetest.get_player_by_name(name)
|
||||||
if player then -- player is online
|
if player then -- player is online
|
||||||
local player_pos = player:get_pos()
|
local player_pos = player:get_pos()
|
||||||
|
local player_name = player:get_player_name()
|
||||||
-- TODO use pointed thing to provide some description?
|
-- TODO use pointed thing to provide some description?
|
||||||
local pointed_pos, pointed_thing = get_pointed_position(player, point_range)
|
local pointed_pos, pointed_thing = get_pointed_position(player, point_range)
|
||||||
if not pointed_pos then
|
if not pointed_pos then
|
||||||
@ -91,8 +110,13 @@ minetest.register_chatcommand(announce_command_name, {
|
|||||||
pointed_pos = player_pos
|
pointed_pos = player_pos
|
||||||
end
|
end
|
||||||
-- TODO limit message length?
|
-- TODO limit message length?
|
||||||
add_announcement(player, player_pos, announce_radius, pointed_pos, param, announce_timeout)
|
add_announcement(player, player_pos, announce_radius, pointed_pos, param, announce_icon, announce_timeout)
|
||||||
return true, "Look at " .. minetest.pos_to_string(pointed_pos)
|
local rounded_pos = vector.round(pointed_pos)
|
||||||
|
return true, minetest.colorize("blue",
|
||||||
|
"[ANNOUNCE] (" ..
|
||||||
|
player_name ..
|
||||||
|
") Look: " .. param .. " " ..
|
||||||
|
minetest.pos_to_string(rounded_pos))
|
||||||
else
|
else
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
BIN
textures/exclamation_mark.png
Normal file
BIN
textures/exclamation_mark.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 150 B |
Loading…
Reference in New Issue
Block a user