refactor using Announcement object

This commit is contained in:
whosit 2021-05-25 07:35:42 +03:00
parent ecf3f06555
commit 68e45eabe8

View File

@ -142,15 +142,29 @@ local function hide_hud_waypoint(player_name, hud_ids)
end
end
local Announcement = {}
function Announcement:new(announcer_name, radius, message, icon, timeout)
local a = {
announcer_name = announcer_name,
radius = radius,
message = message,
icon = icon,
timeout = timeout,
players_huds = {},
}
setmetatable(a, self)
return a
end
local prepared_announcements = {}
local function prepare_announcement(announcer_name, announce_radius, message, announce_icon, announce_timeout)
local function prepare_announcement(announcer_name, radius, message, icon, timeout)
--prepared_announcements[select(1,...)] = table.pack(...) -- does not work in older lua?
prepared_announcements[announcer_name] = {announcer_name, announce_radius, message, announce_icon, announce_timeout}
prepared_announcements[announcer_name] = Announcement:new(announcer_name, radius, message, icon, timeout)
end
local function add_announcement(announcer, announcer_name, radius, message, icon_name, timeout)
local function add_announcement(announcer, announcement)
local player_pos = announcer:get_pos()
-- TODO use pointed thing to provide some description?
local pointed_pos, pointed_thing = get_pointed_position(announcer, point_range)
@ -159,33 +173,33 @@ local function add_announcement(announcer, announcer_name, radius, message, icon
pointed_pos = player_pos
end
for i, object in pairs(minetest.get_objects_inside_radius(player_pos, radius)) do
for i, object in pairs(minetest.get_objects_inside_radius(player_pos, announcement.radius)) do
if object:is_player() then
local player = object
local player_name = player:get_player_name()
local hud_ids = show_hud_waypoint(player, pointed_pos, message, icon_name)
local hud_ids = show_hud_waypoint(player, pointed_pos, announcement.message, announcement.icon)
minetest.after(announce_timeout, hide_hud_waypoint, player_name, hud_ids)
end
end
local rounded_pos = vector.round(pointed_pos)
local chat_message = "[ANNOUNCE] (" ..
announcer_name ..
announcement.announcer_name ..
") Look: " ..
message .. " " ..
announcement.message .. " " ..
minetest.pos_to_string(rounded_pos)
minetest.chat_send_all(minetest.colorize(chat_message_color, chat_message))
end
local function check_click_for_prepared_players(dtime)
for player_name, prepared_args in pairs(prepared_announcements) do
for player_name, announcement in pairs(prepared_announcements) do
local player = minetest.get_player_by_name(player_name)
if player then
local player_controls = player:get_player_control()
if player_controls['dig'] then
-- place prepared announcement at pointed position
add_announcement(player, unpack(prepared_args))
add_announcement(player, announcement)
prepared_announcements[player_name] = nil
elseif player_controls['place'] then
-- cancel prepared announcement
@ -229,7 +243,8 @@ minetest.register_chatcommand(announce_command_name, {
local player = minetest.get_player_by_name(name)
if player then -- player is online
local player_name = player:get_player_name()
add_announcement(player, player_name, announce_radius, param, announce_icon, announce_timeout)
local announcement = Announcement:new(player_name, announce_radius, param, announce_icon, announce_timeout)
add_announcement(player, announcement)
return true
else
return false